美文网首页
递归解析json节点并替换

递归解析json节点并替换

作者: 木木子丶 | 来源:发表于2022-04-06 15:24 被阅读0次

当我们被动接收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?"}}}
image.png

可以看到对象有好几层,并且有可能包含数组及不规则对象,如果我们想寻找所有节点下的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);
    }

思路

  1. 递归节点下所有节点
  2. 如果发现节点下还有对象则递归
  3. 记录该符合条件的节点在json中的下标即位置
  4. 将位置统一放在list里后,使用方法统一替换

运行结果如下


image.png

可以看出所有包含".wav"的value都被替换了

注:文中会使用hutool工具类,需要在maven中引入

相关文章

网友评论

      本文标题:递归解析json节点并替换

      本文链接:https://www.haomeiwen.com/subject/vzvtsrtx.html