调用接口api返回数据时候,在代码中不想写魔法值(未申明的常量),所以想用具体类型接收。
下面我生成了一些测试的json字符串提供了测试。
String jsonStr="{\"success\":true,\"requestid\":\"0af8f5df\",\"code\":null,\"msg\":null,\"detail\":null,\"data\":{\"dataSuccess\":true,\"message\":[{\"apimaterNo\":\"hw-001\",\"corpcode\":\"44199880\",\"ismatch\":\"1\",\"itemno\":\"129004525\",\"remark\":\"对照\",\"requestno\":\"201912121336445344\"}],\"method\":\"addPurchaseApply\",\"returnstatus\":0}}";
// 写法一
JSON.parseObject(jsonStr,new TypeReference<ResponseResult<DataInfo<DataMessage>>>(){})
// 写法二
JSON.parseObject(jsonStr,new TypeReference<ResponseResult<Object>>(){})
其中写法一的截图如下:
写法二截图:
写法二转换信息 message 信息类型默认转换(源码看通过case 判断 '[' '{'来生产对应类型),其中有关具体转换方法感兴趣查看源码。
说明:以上用到的所有实体类
@Data public class DataInfo<T> { /** * 未说明 */ private boolean dataSuccess; /** * 未说明 */ private String method; /** * 未说明 */ private int returnstatus; private List<T> message; }@Data public class DataMessage { private String apimaterNo; private String corpcode; private String ismatch; private String itemno; private String remark; private String requestno; }@Data public class ResponseResult<T> { /** * 处理结果 */ private boolean success; /** * 未知 */ private String requestid; /** * 发生异常事的错误码 */ private String code; /** * 未说明 */ private String msg; /** * 未说明 */ private String detail; /** * 返回的数据 */ private T data; }以上为用到的三个类,其余类com.alibaba.fastjson 包下类
总结:
更新于2022年7月15日。
在测试过程中发现,fastjson2.0.1 (2|3)版本上述方式运行会抛出异常。
正常解析的版本:1.2.83 、 2.0.9、2.0.8,更多版本可以自行尝试。
本文介绍了在Java中使用com.alibaba.fastjson库时,如何利用TypeReference泛型将接收到的JSON字符串转换为特定类型的对象,避免使用魔法值。文中展示了两种不同的转换方法,并附有相关截图。此外,还提到了在不同版本的Fastjson中可能出现的异常情况,如2.0.1 (2|3)版本,推荐使用1.2.83、2.0.9或2.0.8等稳定版本。


476

被折叠的 条评论
为什么被折叠?



