关于JSONArray转换遇到的坑是怎么样的

本篇文章给大家分享的是有关关于JSONArray转换遇到的坑是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联公司从2013年成立,先为汇川等服务建站,汇川等地企业,进行企业商务咨询服务。为汇川企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

先展示一段代码:

List initList = initEnableRecoveryChoose(null);
if(CollectionUtils.isEmpty(initList)) return null;

String elistStr = JSONObject.toJSONString(initList);

net.sf.json.JSONArray jsonArray = JSONArray.fromObject(elistStr);
List enableChList = (List) jsonArray.toCollection(jsonArray, DataRecoveryEnableDto.class);

上面的代码中,一开始的initList查询出来的数据如图:

关于JSONArray转换遇到的坑是怎么样的

但是经过转换为json字符串,然后再转换为List后发现对象里面的时间却变成了当前时间:

关于JSONArray转换遇到的坑是怎么样的

说好的对象转换呢?结果与想象总是有所差距

我们先查看转换为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转换遇到的坑是怎么样的

查看jsonArray中的每个对象的时间:

关于JSONArray转换遇到的坑是怎么样的

如图可以发现就是字符串对应的时间,所以到此处应该还是没有问题的,可以断定问题应该是出现在这一句:

List enableChList = (List) jsonArray.toCollection(jsonArray, DataRecoveryEnableDto.class);

通过跟进源码可以发现应该是在这个方法里面进行的处理long类型为日期的:

关于JSONArray转换遇到的坑是怎么样的

关于JSONArray转换遇到的坑是怎么样的

继续跟进可以发现,这个源码里面是按照java.util.Date的类型进行了newInstance操作,也就是等价于new Date的操作

关于JSONArray转换遇到的坑是怎么样的

综合上面可以发现,将String类型的json串转换为List的时候,尽量不要使用如下方式,除非对日期没有要求:

net.sf.json.JSONArray jsonArray = JSONArray.fromObject(elistStr);
List enableChList = (List) jsonArray.toCollection(jsonArray, DataRecoveryEnableDto.class);

添加测试代码进行测试:

public static void main(String[] args) {
    long t1 = 1562601600000l;
    long t2 = 1562688000000l;
    List 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 list = array.toJavaList(DataRecoveryEnableDto.class);
    List enableChList = (List)JSONObject.parseObject(elistStr,initList.getClass());
    list.stream().forEach(dto->{
        System.out.println(dto.getFromNodeCode()+"-"+dto.getToNodeCode()+"-"+dto.getTransDate());
    });
    System.out.println(JSONObject.toJSONString(list));
}

执行结果:关于JSONArray转换遇到的坑是怎么样的

如图可以发现使用阿里巴巴的这种方式还是好使的:

String elistStr = JSONObject.toJSONString(initList);

JSONArray array = JSONArray.parseArray(elistStr);

List list = array.toJavaList(DataRecoveryEnableDto.class);

至此,希望可以帮助路过的友人!

以上就是关于JSONArray转换遇到的坑是怎么样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网站栏目:关于JSONArray转换遇到的坑是怎么样的
浏览路径:http://myzitong.com/article/pjoeep.html