java中包装类型字段为null时,默认序列化行为因库而异:jackson和gson默认输出"field":null,fastjson 1.x默认跳过该字段;需用@jsoninclude(non_null)或全局配置控制null字段不输出。

Java中当实体类使用包装类型(如 Integer、String、Boolean 等)且字段值为 null,在序列化为 JSON 时,默认行为取决于所用的 JSON 库及其配置。不加干预的情况下,常见表现是:字段仍会出现在 JSON 中,值为 null,例如 {"name":null,"age":null}。
不同库的默认行为差异
各主流 JSON 库对 null 的处理策略不同:
-
Jackson:默认保留
null字段,输出"field": null -
Fastjson 1.x:默认跳过值为
null的字段,不生成对应 key -
Gson:默认保留
null,输出"field": null;需显式调用.serializeNulls()才强制输出(其实它本来就会,该方法是“显式开启”,而非“关闭”)
为什么包装类型要特别注意?
包装类型可为 null,而基本类型(如 int、boolean)不能。若误用基本类型:
-
private int age;未赋值时自动为0,前端收到{"age":0},无法区分“数据库确实存了 0”还是“字段为空/未填写” -
private Integer age;未赋值即为null,语义更准确,但需配合序列化策略控制是否透出
如何让 null 字段不出现?
以 Jackson 为例,两种常用方式:
- 在实体类上加注解:
@JsonInclude(JsonInclude.Include.NON_NULL),该类所有null字段都不序列化 - 全局配置
ObjectMapper:mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL),影响全部序列化操作 - 注意:
NON_NULL只对null生效;若还需过滤空字符串或空集合,可改用NON_EMPTY
前端收到 "field": null 会怎样?
JSON 标准完全支持 null,前端 JavaScript 解析后得到真实 null 值,不是字符串 "null":
-
JSON.parse('{"name":null}').name === null→true - 但直接访问嵌套属性易报错,如
res.user.name在user为null时抛Cannot read property 'name' of null - 建议用可选链
res.user?.name或先判空res.user && res.user.name
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











