您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關關于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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。