使用遞迴方法替換JSON裡面的內容(不管多少層)-阿里的JSONObject
阿新 • • 發佈:2018-12-18
今天一同事問我json裡面的資料怎麼改 我一看 好像挺簡單的樣子,然後把json字串轉成JsonObject,然後再使用JsonObject的put方法,修改就可以類,的確很方便,但是如果json裡面還有json呢,這樣就不行了,還要一層一層挖,還得固定key值才行。所以,自己弄了個可以多個引數改動的方法:
改動前的json字串為:
{ "channel": "WX_TAG", "callback": "11110000-01-A00", "messageList": [ { "messageId": "123", "batchNo": "123", "channel": "WX_TAG", "callback": "11110000-01-A00", "senderId": "wxea33555e2a839286", "body": { "filter": { "is_to_all": false, "tag_id": 100 }, "text": { "content": "CONTENT" }, "msgtype": "text" } }, { "messageId": "123", "batchNo": "123", "channel": "WX_TAG", "callback": "11110000-01-A00", "senderId": "wxea33555e2a839286", "body": { "filter": { "is_to_all": false, "tag_id": 100 }, "text": { "content": "CONTENT" }, "msgtype": "text" } } ] }
這個json裡面還有list 也是可以解決的。以下是程式碼:
public static JSONObject toMap(String str,Map<String,String> replaceMap){ Map<String, String> map=new HashMap<>(); JSONObject jsonObject=JSONObject.parseObject(str); //遍歷 Set<String> set=jsonObject.keySet(); for (String string : set) { Set<String> mapSet = replaceMap.keySet(); for (String s : mapSet) { if (s.equals(string)) { jsonObject.put(s, replaceMap.get(s)); } if (jsonObject.getString(string).contains(":")) {//冒號可以判斷該欄位值為一個json if (jsonObject.getString(string).contains("]")){// ]可以判斷該欄位值為一個數組,陣列就需要轉成JsonArray才行 // JSONArray array=JSONObject.parseArray(jsonObject.getString(string)); // for (Object o : array) { // JSONObject jsonObject2= toMap(o.toString(),replaceMap);//遞迴,回撥自己的函式,以達到一層一層往下挖,看看還有多少的json字串 // jsonObject.put(string, jsonObject2); // } //以上的array遍歷有bug 改成以下遍歷: for (int i = 0; i < array.size() ;i++) { Object o = array.get(i); array.set(i,toMap(o.toString(),replaceMap)); } jsonObject.put(string, array); }else{ JSONObject jsonObject2=toMap(jsonObject.getString(string),replaceMap); jsonObject.put(string, jsonObject2); } } } } return jsonObject; } public static void main(String[] args) { String jsonStr="{"channel":"WX_TAG","callback":"11110000-01-A00","messageList":[{"messageId":"123","batchNo":"123","channel":"WX_TAG","callback":"11110000-01-A00","senderId":"wxea33555e2a839286","body":{"filter":{"is_to_all":false,"tag_id":100},"text":{"content":"CONTENT"},"msgtype":"text"}},{"messageId":"123","batchNo":"123","channel":"WX_TAG","callback":"11110000-01-A00","senderId":"wxea33555e2a839286","body":{"filter":{"is_to_all":false,"tag_id":100},"text":{"content":"CONTENT"},"msgtype":"text"}}]}";//報錯的話,在除了第一個和最後一個"號前面加上\即可 Map<String,String> replaceMap =new HashMap<>(); replaceMap.put("messageId","uuuuuuu");//key-value表示為:key為要替換的欄位 value表示該欄位的欄位值 replaceMap.put("content","contentcontentcontent"); replaceMap.put("msgtype","msgtypemsgtypemsgtypemsgtype"); replaceMap.put("is_to_all","is_to_allis_to_all"); JSONObject jsonObject = toMap(jsonStr, replaceMap); System.out.println("替換後的資訊是: :"+jsonObject.toJSONString().);
匯入的包為:
import com.alibaba.fastjson.JSONObject;