先展现一段代码: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);
至此,但愿能够帮助路过的友人!