Java中JSON格式反序列化為Map且保證存取順序一致的問題
背景
做項目涉及兩個微服務(wù)之間傳數(shù)據(jù)時,需要提供方將Map類型的數(shù)據(jù)序列化為com.alibaba.fastjson.JSONObject,再轉(zhuǎn)化為JSONString,傳給接收方,接收方將String轉(zhuǎn)換為com.alibaba.fastjson.JSONObject,再反序列化為Map,且接收方需要保持存取順序一致。
問題
- 不能將String轉(zhuǎn)為JSONObject,再強轉(zhuǎn)為LinkedMap,這樣編譯會報錯;
- 也不能將String轉(zhuǎn)為JSONArray,再一個一個賦值,組建成LinkedHashMap,還是無序的;
- 也不能在發(fā)送方發(fā)送對象的toString格式,在接收方將其轉(zhuǎn)換為LinkedHashMap。
解決方法
(1)對于僅有一層對象數(shù)據(jù)內(nèi)部沒有其他對象或內(nèi)部有其他對象但不需要保證內(nèi)部其他對象的存取順序一致。
//發(fā)送方這樣存數(shù)據(jù) JSONObject map=new JSONObject(true);//關(guān)鍵所在,要設(shè)置為true,否則會亂序 map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); //發(fā)送方將map.toString()傳給接收方 //接收方將從發(fā)送方獲取的String轉(zhuǎn)化為有序的LinkedHashMap LinkedHashMap<String, String> root=JSON.parseObject(map.toString(), new TypeReference<LinkedHashMap<String, String>>(){});//關(guān)鍵所在,轉(zhuǎn)化為有序的
(2)對于有多層對象數(shù)據(jù),且需要保證內(nèi)部其他對象的存取順序一致。
//發(fā)送方定義多個JSONObject JSONObject mapOut = new JSONObject(true); for () { JSONObject mapIn= new JSONObject(true); mapIn.put("key1", "value1"); mapIn.put("key2", "value2"); mapOut.put("key3", mapIn); } //發(fā)送方將mapOut.toString()發(fā)送給接收方 //接收方將String轉(zhuǎn)化為有序的LinkedHashMap且內(nèi)部結(jié)構(gòu)也有序 LinkedHashMap<String, Map<String, Object>> map = JSON.parseObject(mapOut.toString(), new TypeReference<LinkedHashMap<String, Map<String, Object>>>(){}, Feature.OrderedField);
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解
這篇文章主要介紹了Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08spring cloud gateway集成hystrix實戰(zhàn)篇
這篇文章主要介紹了spring cloud gateway集成hystrix實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07spring-cloud入門之eureka-server(服務(wù)發(fā)現(xiàn))
本篇文章主要介紹了spring-cloud入門之eureka-server(服務(wù)發(fā)現(xiàn)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01