jackson踩坑一

业务系统突然抛出一个数据转换异常,显示报文比实体类多了一个bankSellMoney 属性;


image.png
image.png

原因是其他同事在新版本中共同的父类中增加了一个属性bankSellMoney,但是我的服务还是引用旧版的父类。虽然没有显性的给它赋值,但是由于默认空置也序列化了导致反序列化时找不到属性
思考:应该没有匹配上的属性不需要拷贝属性值呀怎么直接抛出异常了,认真对比了一下jackson 和阿里的fastjson;

jackson

从默认配置中看到如果实体中没有这个属性并且没有一个set 方法 将抛出一个异常


image.png

fastjson

从默认配置中看到默认忽略没有匹配上的属性,换言之就是只有属性名完全一致的字段才会设值;


image.png

通过上面Jackson 和 fastjson的源码默认配置可知 fastjson 的兼容性更好,jackson可能要求更高的约束性吧;

解决:

方案一:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String json = mapper.writeValueAsString(yourObject);
System.out.println(json);
直接忽略空属性

方案二:

 MAPPER.registerModule(new Jdk8Module())
                .registerModule(new JavaTimeModule())
                .registerModule(new ParameterNamesModule())
                //添加默认时区为东八区
                .setTimeZone(TimeZone.getTimeZone("GMT+8:00"))
                .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
                // 忽略JSON中存在但对应Java对象不存在的属性
                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容