Json字符串递归遍历进行解析,并对value值作出修改

最近碰到个需求,需求其中有个环节需要对一个json字符串其中的value值做解密处理,也就是这个json字符串不能对应到那个对象,但是需要找出里面的value值并对其进行修改。

所以做了个小递归处理,进行记录,具体实现方式如下:

 public JSONObject analyseJson(String jsonData) {
        JSONObject jsonObjectResult = new JSONObject();
        //把传入String类型转换成JSONObject对象
        JSONObject jsonObject = JSON.parseObject(jsonData);
        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
            String key = entry.getKey();
            //如果value依旧是json类型的话继续递归解析
            if (!StringUtils.isEmpty(String.valueOf(entry.getValue())) && isJSON(entry.getValue().toString())) {
                jsonObjectResult.put(key, analyseJson(entry.getValue().toString()));
            } else {
                //如果value是单纯的数据,则直接封装
                jsonObjectResult.put(key, entry.getValue());
            }
        }
        return jsonObjectResult;
    }

其中会引用到一个方法isJSON,也就是判断这个value是不是json格式,也就是说如果有嵌套格式的json类型,具体方法如下:

/**
     * 判断传入的参数是否为json格式
     * @param str
     * @return
     */
    public boolean isJSON(String str) {
        boolean result;
        try {
            JSON.parse(str);
            result = true;
        } catch (Exception e) {
            result = false;
        }
        return result;
    }

测试结果:

 完整代码案例:

 
    public static void main(String[] args) {
        String normal = "{\"test\":\"A\"}";
        System.out.println("测试普通的json结果:"+analyseJson(normal));
        String mulipte = "{\"test\":\"A\",\"test1\":{\"key\":{\"key1\":\"B\"}}}";
        System.out.println("测试嵌套的json结果:"+analyseJson(mulipte));
    }

    /**
     * 解析json字符串,普通和嵌套类型都可
     * @param jsonData
     * @return
     */
    public static JSONObject analyseJson(String jsonData) {
        JSONObject jsonObjectResult = new JSONObject();
        //把传入String类型转换成JSONObject对象
        JSONObject jsonObject = JSON.parseObject(jsonData);
        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
            String key = entry.getKey();
            //如果value依旧是json类型的话继续递归解析
            if (!StringUtils.isEmpty(String.valueOf(entry.getValue())) && isJSON(entry.getValue().toString())) {
                jsonObjectResult.put(key, analyseJson(entry.getValue().toString()));
            } else {
                //如果value是单纯的数据,则直接封装
                jsonObjectResult.put(key, "test"+entry.getValue());
            }
        }
        return jsonObjectResult;
    }

    /**
     * 判断传入的参数是否为json格式
     * @param str
     * @return
     */
    public static boolean isJSON(String str) {
        boolean result;
        try {
            JSON.parse(str);
            result = true;
        } catch (Exception e) {
            result = false;
        }
        return result;
    }

完毕!

可以使用Java中的Json解析库Jackson或者Gson来解析Json字符串。假设我们要获取所有层级中key为"param"的,可以按照以下步骤进行: 1. 将Json字符串转化为JsonNode对象或JsonObject对象 ``` // 使用Jackson库将Json字符串转化为JsonNode对象 JsonNode jsonNode = new ObjectMapper().readTree(jsonString); // 使用Gson库将Json字符串转化为JsonObject对象 JsonObject jsonObject = new Gson().fromJson(jsonString, JsonObject.class); ``` 2. 编写递归函数,遍历JsonNode对象或JsonObject对象的所有节点,查找key为"param"的 ``` // 使用Jackson库的JsonNode对象遍历 private void findParamValue(JsonNode node) { if (node.isObject()) { // 如果当前节点是对象 Iterator<String> fieldNames = node.fieldNames(); // 获取所有字段名 while (fieldNames.hasNext()) { // 遍历所有字段 String fieldName = fieldNames.next(); JsonNode childNode = node.get(fieldName); // 获取当前字段对应的节点 if (childNode.isObject() || childNode.isArray()) { // 如果当前节点是对象或数组 findParamValue(childNode); // 继续递归遍历 } else if (fieldName.equals("param")) { // 如果当前字段是"param" String paramValue = childNode.asText(); // 获取"param"的 // TODO: 处理"param"的 } } } else if (node.isArray()) { // 如果当前节点是数组 for (JsonNode childNode : node) { // 遍历数组中的所有元素 if (childNode.isObject() || childNode.isArray()) { // 如果当前节点是对象或数组 findParamValue(childNode); // 继续递归遍历 } } } } // 使用Gson库的JsonObject对象遍历 private void findParamValue(JsonObject obj) { for (Map.Entry<String, JsonElement> entry : obj.entrySet()) { // 遍历所有键对 String key = entry.getKey(); JsonElement value = entry.getValue(); if (value.isJsonObject() || value.isJsonArray()) { // 如果当前是对象或数组 findParamValue(value); // 继续递归遍历 } else if (key.equals("param")) { // 如果当前键是"param" String paramValue = value.getAsString(); // 获取"param"的 // TODO: 处理"param"的 } } } ``` 3. 调用递归函数进行遍历 ``` // 使用Jackson库的JsonNode对象遍历 findParamValue(jsonNode); // 使用Gson库的JsonObject对象遍历 findParamValue(jsonObject); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值