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

发布时间:2021-10-19 18:41:29 作者:柒染
来源:亿速云 阅读:150

本篇文章给大家分享的是有关关于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查询出来的数据如图:

关于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<DataRecoveryEnableDto> enableChList = (List<DataRecoveryEnableDto>) 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<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));
}

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

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

String elistStr = JSONObject.toJSONString(initList);

JSONArray array = JSONArray.parseArray(elistStr);

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

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

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

推荐阅读:
  1. JSONArray.fromObject转换string为JSONArray丢失精度
  2. hadoop遇到的坑

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jsonarray

上一篇:如何自己写一个TypeAdapter及注册TypeAdapter和处理Enum类型.

下一篇:docker怎么进行容器监控

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》