Jackson等JSON库默认序列化null字段,可通过全局配置spring.jackson.include=NON_NULL、@JsonInclude注解或GsonBuilder.serializeNulls()等方法过滤null值,但需注意前端兼容性和JSON Schema同步更新。

Java 序列化(如 Jackson、FastJSON、Gson)默认会把对象中值为 null 的字段也写入 JSON,这会增加传输体积和存储开销。要过滤掉 null 值,关键不是改 Java 原生序列化(它不生成 JSON),而是配置你用的 JSON 库——最常见的是 Jackson。
Jackson:全局禁用 null 字段
在 Spring Boot 项目中,推荐通过配置文件统一控制:
spring.jackson.include=NON_NULL
或者在 Java 配置类中手动设置 ObjectMapper:
- 创建
ObjectMapper实例 - 调用
setSerializationInclusion(JsonInclude.Include.NON_NULL) - 确保所有 JSON 处理都复用这个实例(如注册为
@Bean)
Jackson:按字段或类粒度控制
更灵活的方式是用注解精准控制:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
@JsonInclude(JsonInclude.Include.NON_NULL)加在类上:整个类生效 -
@JsonInclude(JsonInclude.Include.NON_NULL)加在某个字段上:仅该字段跳过 null -
@JsonInclude(JsonInclude.Include.NON_EMPTY)还能同时跳过空字符串、空集合等
FastJSON 和 Gson 的对应配置
如果你用的是 FastJSON:
- 1.x 版本:设置
SerializerFeature.WriteMapNullValue为false - 2.x 版本:使用
JSONWriter.Feature.WriteNulls关闭(注意它是“不写 null”,默认已关闭)
Gson 则通过 GsonBuilder:
-
new GsonBuilder().serializeNulls().create()→ 默认不序列化 null,无需额外配置 - 若需显式确认,可加
.excludeFieldsWithModifiers(Modifier.TRANSIENT)等辅助过滤
注意边界情况
过滤 null 虽然减体积,但要注意:
- 前端可能依赖某些字段存在(即使为 null)来判断状态,移除后变成“字段缺失”,语义不同
- 如果用了 JSON Schema 校验,需同步更新 required 字段列表
- Map 类型中 key 为 null 不受此影响(JSON 标准不允许 null key,通常已被忽略或报错)

















