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
相关产品推荐
相关产品推荐

