You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jackson 2.9.x升级后NON_DEFAULT行为异常,需配置仅忽略Null与空集合

Jackson 2.9+ NON_DEFAULT行为变化解决方案

刚踩过这个坑!Jackson在2.9版本确实对NON_DEFAULT的序列化规则做了关键调整——2.8.x版本里,NON_DEFAULT只会忽略对象默认构造生成的属性值,但2.9.x开始,它会把所有基本类型的默认值(比如int的0、boolean的false)也判定为"默认值"过滤掉,这就是你测试用例失效的核心原因。

根据你的需求(忽略Null字段和空集合,保留空字符串、false、0等),完全不需要依赖NON_DEFAULT,用以下组合配置就能完美解决:

全局配置方案

直接在ObjectMapper上设置两个关键项:

ObjectMapper objectMapper = new ObjectMapper();
// 忽略所有值为null的字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 禁用空数组/集合的序列化(即空集合不会出现在输出JSON中)
objectMapper.disable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS);

注解级局部配置

如果不想全局生效,可以在特定类或字段上配合注解实现:

// 在类上标记忽略null字段
@JsonInclude(JsonInclude.Include.NON_NULL)
public class YourBusinessBean {
    // 空字符串会被保留
    private String emptyString = "";
    // false会被保留
    private boolean flag = false;
    // 0会被保留
    private int count = 0;
    // 空集合会因全局WRITE_EMPTY_JSON_ARRAYS禁用而被忽略
    private List<String> emptyList = new ArrayList<>();
    // null字段会被忽略
    private String nullField = null;
    
    // getters & setters
}

验证效果

序列化上述YourBusinessBean实例后,输出的JSON会是:

{
  "emptyString": "",
  "flag": false,
  "count": 0
}

完全符合你要的效果:null和空集合被忽略,空字符串、false、0全部保留。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:33:11