1. 程式人生 > >使用遞迴方法替換JSON裡面的內容(不管多少層)-阿里的JSONObject

使用遞迴方法替換JSON裡面的內容(不管多少層)-阿里的JSONObject

今天一同事問我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;