使用递归方法替换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;

猜你喜欢

转载自blog.csdn.net/shenhaiyushitiaoyu/article/details/84876281