当我们被动接收json数据或处理不固定json串时,如果想寻找并替换某一个key下的value值时,我们该怎么做
首先要遍历json,JSONObject的keySet类似于map可以遍历下面所有的key,
但是如果节点下面还有对象,那就要用到递归了
假如有这么一串json
{"aaa":{"aa":{"a":"http://multimedia-dplus-algorithm-hangzhou.oss-cn-hangzhou.aliyuncs.com/tempmaker%2F20210819%2Ftmpdkoela1j.wav?"}},"b":[1,2],"bbb":{"aa":{"a":"http://multimedia-dplus-algorithm-hangzhou.oss-cn-hangzhou.aliyuncs.com/tempmaker%2F20210819%2Ftmpdkoela1j.wav?"}}}
可以看到对象有好几层,并且有可能包含数组及不规则对象,如果我们想寻找所有节点下的value并找出包含".wav"的字符串并替换掉,做法是什么呢?
/**
* 寻找节点下某特定值并替换
* @author xuzimu
* @date 2022/4/6
* @return void
*/
private static void flush(JSONObject jsonObject,String containsValue,StringBuilder sb,List<String> sbList) {
for (String key : jsonObject.keySet()) {
String value = jsonObject.get(key).toString();
if(JSONUtil.isJson(value)) {
if (JSONUtil.isJsonArray(value)) {
continue;
} else if (JSONUtil.isJsonObj(value)) {
sb.append(".").append(key);
flush(JSON.parseObject(value),containsValue,sb,sbList);
}
}else {
if (value.contains(containsValue)) {
sb.append(".").append(key);
sbList.add(sb.toString());
sb.setLength(0);
}
}
}
}
测试用例如下 :
public static void main(String[] args) {
String s = "{\"aaa\":{\"aa\":{\"a\":\"http://multimedia-dplus-algorithm-hangzhou.oss-cn-hangzhou.aliyuncs.com/tempmaker%2F20210819%2Ftmpdkoela1j.wav?\"}},\"b\":[1,2]}";
JSONObject jsonObject = JSON.parseObject(s);
StringBuilder sb = new StringBuilder();
List<String> list = Collections.synchronizedList(new ArrayList<>());
flush(jsonObject,".wav",sb,list);
cn.hutool.json.JSON parse = JSONUtil.parse(jsonObject);
System.out.println(jsonObject);
list.forEach(string->{
JSONUtil.putByPath(parse,"$"+string,"新连接");
});
System.out.println(parse);
}
思路
- 递归节点下所有节点
- 如果发现节点下还有对象则递归
- 记录该符合条件的节点在json中的下标即位置
- 将位置统一放在list里后,使用方法统一替换
运行结果如下
可以看出所有包含".wav"的value都被替换了
注:文中会使用hutool工具类,需要在maven中引入