使用递归方法替换JSON里面的内容(不管多少层)-阿里的JSONObject
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
今天一同事问我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;
GitHub 加速计划 / js / json
18
5
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:2 个月前 )
6be4e856
5 天前
663058e7
7 天前
更多推荐
已为社区贡献3条内容
所有评论(0)