多层嵌套JSON找出指定key对应值

背景
需要从一个不确定的JSON中找出一个指定key对应的值,返回一个Map<String,Object>。
注意点
因为不确定有几层json嵌套,需要递归解析,只到解析成一个对象值 或者找到了指定key。

具体代码实现举例:
本次只写了Int类型,其他类型类似
我全部写在测试类中,可直接运行测试:

package xxx.xxx.xxx(自己类路径);
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.*;

public class TestJson {
    public static void main(String[] args) {
    	//json格式的String字段
        String json = "{\"josnOne\":{\"number\":\"101\",\"Demo2\":{\"label\":\"test1\",\"key\":\"customerCode1\"},\"projectName\":\"测试manage\"},\"JsonTwo\":{\"Demo2\":{\"label\":\"张淑娜\",\"key\":\"10007319622\",\"number1\":\"102\"},\"A\":\"A\",\"Phone\":\"13466666666\"}}";
       	//String 转为Json
        JSONObject jsonObject = JSONObject.parseObject(json);
        //要查找的key,例如number、number1
        List<String> list = Arrays.asList("number","number1");
        //查询到的值 Map<key,key对应的值>
        Map<String, Object> result = new HashMap<>();
        ParsingJson(jsonObject,list,result);
        System.out.println(result);

    }
     /**
     * 获取指定key对应value值
     * @param content json对象
     * @param conditionKey 要查找的key
     * @param result 输出map
     */
    public static void  ParsingJson(JSONObject content,List<String> conditionKey ,Map<String, Object> result) {

        Set<String> keySet = content.keySet();

        conditionKey.forEach(conkey -> {
            keySet.forEach(key -> {
                Object contentKey = content.get(key);

                //如果是一个对象
                if (contentKey instanceof JSONObject) {
                    JSONObject jsonObject = (JSONObject) contentKey;
					//判断是否存在key
                    Integer keyValue = jsonObject.getInteger(conkey);
                    if(Objects.nonNull(keyValue)){
                        //赋值map
                        result.put(conkey,keyValue);
                        //递归
                    }else {
                        ParsingJson(jsonObject,Arrays.asList(conkey),result);
                    }

                    //如果是一个值
                } else if (contentKey instanceof JSONArray) {
                    JSONArray jsonArray = (JSONArray) contentKey;
                    //判断当前是否找到key
                    if(key.equals(conkey)){
                        Integer keyValue = Integer.valueOf(jsonArray.toJSONString());
                        //赋值map
                        result.put(conkey,keyValue);
                    }

                }

            });
        });
    }
}

看一下运行结果

在这里插入图片描述

JSON 判断一个 key 是否存在可以通过以下方式: 假设有以下 JSON 对象: ```json { "name": "John", "age": 30, "address": { "city": "New York", "country": "USA" }, "hobbies": [ "reading", "traveling" ] } ``` 可以使用以下 Java 代码判断 `name` 和 `phone` 两个属性是否存在: ```java import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); String jsonString = "{...}"; // JSON 字符串 JsonNode jsonNode = mapper.readTree(jsonString); // 判断 key 是否存在 boolean hasName = jsonNode.has("name"); boolean hasPhone = jsonNode.has("phone"); ``` 在进行 JSON Patch 操作时,可以使用 `has` 操作来判断一个 key 是否存在,例如: ```json [ { "op": "test", "path": "/address/city", "value": "New York" }, { "op": "add", "path": "/phone", "value": "1234567890", "condition": { "op": "has", "path": "/name" } } ] ``` 上面的 JSON Patch 操作,当 `/name` 存在时才能执行添加 `/phone` 的操作。在执行时,可以先使用 `has` 操作来判断 `/name` 是否存在,例如: ```java JsonNode patchNode = ...; // JSON Patch 操作 JsonNode rootNode = ...; // JSON 对象 for (JsonNode patchOpNode : patchNode) { String op = patchOpNode.get("op").asText(); String path = patchOpNode.get("path").asText(); String value = patchOpNode.get("value").asText(); if (op.equals("add")) { JsonNode conditionNode = patchOpNode.get("condition"); if (conditionNode != null) { String conditionOp = conditionNode.get("op").asText(); String conditionPath = conditionNode.get("path").asText(); if (conditionOp.equals("has") && !rootNode.has(conditionPath)) { // 如果 conditionPath 不存在,则不执行 add 操作 continue; } } // 执行 add 操作 // ... } else if (op.equals("...")) { // ... } // ... } ``` 在执行添加 `/phone` 的操作时,如果 `/name` 不存在,则不执行该操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值