Jackson 2.9.x保留Map空值序列化:POJO最小修改方案
解决Jackson 2.9.x过滤Map中null值的POJO最小改动方案
我之前也踩过这个Jackson版本差异的坑!2.9.x对NON_NULL序列化规则做了关键调整:在2.8.x里,全局配置setSerializationInclusion(JsonInclude.Include.NON_NULL)只会过滤POJO本身为null的字段,不会干涉Map内部的null键值对;但2.9+开始,它会把Map里的null条目也当成需要过滤的内容,这就是你看到差异的原因。
既然不能修改ObjectMapper的全局配置,只允许改POJO,那最小改动的方案就是给包含Map的字段添加局部注解,覆盖全局的过滤规则:
改动后的POJO代码
static class MyData { // 给members字段添加注解,强制保留所有内容(包括Map内的null) @JsonInclude(JsonInclude.Include.ALWAYS) public Map<String, MyInnerData> members; } static class MyInnerData { // 同样给parameters字段加注解,确保Map内的null不被过滤 @JsonInclude(JsonInclude.Include.ALWAYS) public Object parameters; public boolean isPresent; }
为什么这是最优解?
- 改动量极小:只需要给两个涉及Map的字段各加一行注解,完全不碰业务逻辑或序列化代码
- 局部生效不影响全局:注解只会覆盖这两个字段的序列化规则,其他POJO的全局
NON_NULL配置依然有效 - 完全符合需求:用你原来的测试代码运行,就能得到期望的输出:
{"members":{"data1":{"parameters":{"key-one":"val1","key-null":null,"key-two":"val2","list":{"c1":"v1","c2":null}}},"isPresent":true}}
补充说明:这里必须用Include.ALWAYS,因为NON_EMPTY依然会过滤Map中的null条目,只有ALWAYS能强制保留所有Map内容。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

