本篇文章给大家分享的是有关关于JSONArray转换遇到的坑是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
先展示一段代码:
List<DataRecoveryEnableDto> initList = initEnableRecoveryChoose(null); if(CollectionUtils.isEmpty(initList)) return null; String elistStr = JSONObject.toJSONString(initList); net.sf.json.JSONArray jsonArray = JSONArray.fromObject(elistStr); List<DataRecoveryEnableDto> enableChList = (List<DataRecoveryEnableDto>) jsonArray.toCollection(jsonArray, DataRecoveryEnableDto.class);
上面的代码中,一开始的initList查询出来的数据如图:
但是经过转换为json字符串,然后再转换为List后发现对象里面的时间却变成了当前时间:
说好的对象转换呢?结果与想象总是有所差距
我们先查看转换为json字符串后的内容:
查看串内容:
[{"fromNodeCode":"2","fromNodeName":"新增案件","ruleOrdinal":"18","toNodeCode":"2","toNodeName":"新增案件","transDate":1562601600000},{"fromNodeCode":"2","fromNodeName":"新增案件","ruleOrdinal":"24","toNodeCode":"3","toNodeName":"催收系统","transDate":1562601600000},{"fromNodeCode":"2","fromNodeName":"新增案件","ruleOrdinal":"22","toNodeCode":"4","toNodeName":"直催系统","transDate":1562601600000},{"fromNodeCode":"2","fromNodeName":"新增案件","ruleOrdinal":"23","toNodeCode":"4","toNodeName":"直催系统","transDate":1562601600000},{"fromNodeCode":"3","fromNodeName":"催收系统","ruleOrdinal":"21","toNodeCode":"4","toNodeName":"直催系统","transDate":1562601600000},{"fromNodeCode":"3","fromNodeName":"催收系统","ruleOrdinal":"12","toNodeCode":"5","toNodeName":"客户管理系统","transDate":1562601600000},{"fromNodeCode":"4","fromNodeName":"直催系统","ruleOrdinal":"24","toNodeCode":"3","toNodeName":"催收系统","transDate":1562601600000},{"fromNodeCode":"4","fromNodeName":"直催系统","ruleOrdinal":"25","toNodeCode":"5","toNodeName":"客户系统","transDate":1562601600000},{"fromNodeCode":"5","fromNodeName":"客户系统","ruleOrdinal":"3","toNodeCode":"2","toNodeName":"新增案件","transDate":1562601600000},{"fromNodeCode":"2","fromNodeName":"新增案件","ruleOrdinal":"24","toNodeCode":"3","toNodeName":"快信系统","transDate":1562688000000}]
经过测试可以发现,在将List转换为json字符串的时候,时间被转换为了long类型,但经过转换可以发现还是9日的时间:
查看jsonArray中的每个对象的时间:
如图可以发现就是字符串对应的时间,所以到此处应该还是没有问题的,可以断定问题应该是出现在这一句:
List<DataRecoveryEnableDto> enableChList = (List<DataRecoveryEnableDto>) jsonArray.toCollection(jsonArray, DataRecoveryEnableDto.class);
通过跟进源码可以发现应该是在这个方法里面进行的处理long类型为日期的:
继续跟进可以发现,这个源码里面是按照java.util.Date的类型进行了newInstance操作,也就是等价于new Date的操作
综合上面可以发现,将String类型的json串转换为List的时候,尽量不要使用如下方式,除非对日期没有要求:
net.sf.json.JSONArray jsonArray = JSONArray.fromObject(elistStr); List<DataRecoveryEnableDto> enableChList = (List<DataRecoveryEnableDto>) jsonArray.toCollection(jsonArray, DataRecoveryEnableDto.class);
添加测试代码进行测试:
public static void main(String[] args) { long t1 = 1562601600000l; long t2 = 1562688000000l; List<DataRecoveryEnableDto> initList = new ArrayList<>(); for(int i=0;i<8;i++){ DataRecoveryEnableDto enableDto = new DataRecoveryEnableDto(); enableDto.setFromNodeCode(i+""); enableDto.setToNodeCode((i+2)+""); enableDto.setTransDate(i%2==0?new Date(t1):new Date(t2)); initList.add(enableDto); } String elistStr = JSONObject.toJSONString(initList); JSONArray array = JSONArray.parseArray(elistStr); List<DataRecoveryEnableDto> list = array.toJavaList(DataRecoveryEnableDto.class); List<DataRecoveryEnableDto> enableChList = (List<DataRecoveryEnableDto>)JSONObject.parseObject(elistStr,initList.getClass()); list.stream().forEach(dto->{ System.out.println(dto.getFromNodeCode()+"-"+dto.getToNodeCode()+"-"+dto.getTransDate()); }); System.out.println(JSONObject.toJSONString(list)); }
执行结果:
如图可以发现使用阿里巴巴的这种方式还是好使的:
String elistStr = JSONObject.toJSONString(initList);
JSONArray array = JSONArray.parseArray(elistStr);
List<DataRecoveryEnableDto> list = array.toJavaList(DataRecoveryEnableDto.class);
至此,希望可以帮助路过的友人!
以上就是关于JSONArray转换遇到的坑是怎么样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。