关于JSONArray转换遇到的坑

先展现一段代码:java

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

可是通过转换为json字符串,而后再转换为List后发现对象里面的时间却变成了当前时间:测试

 

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

咱们先查看转换为json字符串后的内容:blog

查看串内容:字符串

[{"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}]get

通过测试能够发现,在将List转换为json字符串的时候,时间被转换为了long类型,但通过转换能够发现仍是9日的时间:源码

 

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

如图能够发现就是字符串对应的时间,因此到此处应该仍是没有问题的,能够判定问题应该是出如今这一句:io

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);

至此,但愿能够帮助路过的友人!

相关文章
相关标签/搜索