jackson 解析泛型的正确写法
解决 1024 当天遗留的 bug:
in unnamed module of loader 'app'
bug 描述
上次使用 jackson 进行数据转换的时候发生了下面这个错误。
错误代码如下:
第一种写法
第二种写法
代码上 body 是从服务器获取到的数据,格式是{"data": [{},{}]}
转换成resultDTO
也是正常的,可以拿到对应的 data, 转换成 list 也是正常的!
然后 bug 来了!😱 去获取 list 中的一个元素就报错上面那个错了🙃🙄 两种写法都会报这个错误。。
整个人都懵了,找了好久都不知道咋回事。。
ResultDTO
代码如下:
解决办法
突然想到自己之前也做过 json 的解析呀,那会都很顺利地解决的🐖
想着不用一步到位,先拿到那个节点的数据,再去转换看看。结果真的成功了!
方案一
代码如下:
错误分析之错误代码的第一种写法
因为前面bjectMapper.readValue(body, ResultDTO.class);
这里没法定义泛型 T 的类型。。所以 jackson 使用了这个LinkedHashMap
来存解析的数据🐖
错误分析之错误代码的第二种写法
objectMapper.readValue(body, Map.class);
这里也是,没办法指定泛型🐖,所以 jackson 还是使用了这个LinkedHashMap
来存解析的数据
分析到这里有点悟出来了!怎么才能将泛型加上去啊!🐖
方案二:使用泛型的正确写法如下:
debug 看一下,终于正确了!!😁
结论
jaskson 解析使用泛型类的时候,有两种做法
局部解析🐖:
通过
readTree()
去获取对应的 jsonnode 节点:JsonNode jsonNode = objectMapper.readTree(body);
再获取到对应节点的数据
jsonNode.get("data");
最后通过
readValue()
:objectMapper.readValue(data.toString(), new TypeReference<List<User>>(){});
解析得到对应的数据
直接解析🐖:
objectMapper.readValue(body, new TypeReference<ResultDTO<List<User>>>(){});
,直接一步到位。
"( ̄y▽, ̄)╭ " 😄
最后
欢迎小伙伴们来一起探讨问题~
如果你觉得本篇文章还不错的话,那拜托再点点赞支持一下呀😝
让我们开始这一场意外的相遇吧!~
欢迎留言!谢谢支持!ヾ(≧▽≦*)o 冲冲冲!!
我是 4ye 咱们下期应该……很快再见!! 😆
版权声明: 本文为 InfoQ 作者【4ye】的原创文章。
原文链接:【http://xie.infoq.cn/article/a8b91386d52c48e5116bd3fa5】。文章转载请联系作者。
评论