如何在 Jackson 序列化中排除未赋值(null)的 POJO 字段

使用 jackson 时,可通过 `@jsoninclude(jsoninclude.include.non_null)` 注解全局或局部控制字段序列化行为,使值为 `null` 的字段不输出到 json 中,从而避免未显式赋值的字段以 `"fieldname": null` 形式出现。

在基于 Jackson 的 Java Web 开发中,POJO 转 JSON 时默认会将所有字段(包括未初始化或显式设为 null 的字段)一并序列化,例如:

public class A {
    private String varOne;
    private String varTwo = "assigned";
}

若仅设置 varTwo,而 varOne 保持默认 null,默认序列化结果为:

{"varOne":null,"varTwo":"assigned"}

这不仅冗余,还可能干扰前端逻辑或 API 兼容性。

推荐解决方案:使用 @JsonIncl

ude 注解

方式一:类级别控制(推荐,简洁且可复用)
在 POJO 类上添加注解,使该类所有 null 值字段均被忽略:

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class A {
    private String varOne;
    private String varTwo = "assigned";

    // getters & setters (required for Jackson)
}

此时序列化结果变为:

{"varTwo":"assigned"}

✅ varOne 完全不出现,符合“未赋值即不输出”的需求。

方式二:全局配置(适用于整个应用)
在 ObjectMapper 初始化时统一设定(如 Spring Boot 中):

@Bean
public ObjectMapper objectMapper() {
    return new ObjectMapper()
        .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

⚠️ 注意事项:

  • @JsonInclude 仅对 null 值生效;若字段是基本类型(如 int、boolean),其默认值(0、false)仍会输出,需改用包装类型(Integer、Boolean)配合 NON_NULL 才能跳过。
  • 若需更精细控制(如忽略空字符串、空集合),可选用 NON_EMPTY 或自定义 JsonSerializer。
  • 该注解不影响反序列化行为——JSON 中缺失字段仍会被正确设为 null(除非配置了 @JsonSetter(nulls = Nulls.SKIP))。

? 总结:@JsonInclude(JsonInclude.Include.NON_NULL) 是最轻量、标准且符合 Jackson 最佳实践的方式,无需手动构建 JSON 或反射过滤,既安全又可维护。