JAVA--递归获取嵌套json中所有key

该文章提供了一段Java代码示例,使用阿里巴巴的Fastjson库来遍历和解析具有未知属性的复杂嵌套JSON对象。代码将JSON对象的每个键值对转换为全路径名称(键替换特殊字符)和对应的值,以便于数据映射。

当我们遇到复杂嵌套json,不知道其中有哪些属性,但是又想取到每条数据的所有值,并且想要拼接key让数据mapping成(全路径名称:值)的方式,可以参照如下方式:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class JsonUtil {
    public static void main(String[] args) {
        String jsonStr = "{\"k8s_app_name\":\"roc\",\"json_extract\":{\"data\":{\"volume\":6,\"rcu\":{\"battery\":{\"temperature\":32,\"chargingStatus\":1,\"percent\":99}},\"robotStatus\":1,\"asrStatus\":1},\"serviceCode\":\"\",\"resultCode\":0,\"rcuId\":\"5013951A62CB\",\"source\":\"ROC\",\"robotId\":\"5013951A62CB\",\"resultInfo\":\"\",\"accountId\":\"AZ019179\",\"robotType\":\"patrol\",\"rodType\":\"reportMetrics\",\"tenantId\":\"patrol_jindi3\",\"guid\":\"9c20192006b845fd90714d5069b93d8b\",\"tag\":\"\",\"moduleId\":\"reportStatus\",\"timestamp\":\"2023-03-31T23:59:58.672+08:00\"},\"label\":\"bj-prod-221_roc_roc_roc-operation-service_harixaudit\",\"k8s_svc_name\":\"roc-operation-service\",\"k8s_env_name\":\"bj-prod-221\",\"output\":\"eskafka\"}";

        HashMap<String, Object> map = new HashMap<>();
        Map<String, Object> resultMap = analysisJson(jsonStr, "", map);

        Iterator<String> iterator = resultMap.keySet().iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            System.out.println("result_key: " + next);
        }
    }

    public static Map<String, Object> analysisJson(String jsonStr, String flag, Map<String, Object> jsonMap) {
        try {
            JSONObject jsonObject = JSON.parseObject(jsonStr);
            Iterator it = jsonObject.keySet().iterator();
            while (it.hasNext()) {
                String key = it.next().toString();
                Object object = jsonObject.get(key);
                if (null != object && isJson(object.toString())) {//如果key中是一个json对象
                    String path = "";
                    if (StringUtils.isNotBlank(flag)) {
//                    path = flag + "." + key;
                        path = flag + "_" + key.replaceAll("\\$", "_D_");
                    } else {
                        path = key.replaceAll("\\$", "_D_");
                    }
//                    jsonMap.put(path, object);
                    analysisJson(object.toString(), path, jsonMap);
                } else {//如果key中是其他
                    String path = "";
                    if (StringUtils.isNotBlank(flag)) {
//                    path = flag + "." + key;
                        path = flag + "_" + key.replaceAll("\\$", "_D_");
                    } else {
                        path = key.replaceAll("\\$", "_D_");
                    }
                    System.out.println(path + ":" + object.toString() + " ");
                    jsonMap.put(path, object);
                }
            }

        } catch (Exception ignored) {

        }
        return jsonMap;
    }

    public static boolean isJson(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }
        Object parse = null;
        try {
            parse = JSON.parse(str);
        } catch (Exception e) {
            return false;
        }
        if (parse instanceof JSONObject) {
            return true;
        }
        return false;
    }
}
Java中使用JSON API从嵌套Map结构中获取值时,通常可以通过遍历Map或利用递归方法来实现。如果数据是通过像Jackson或Gson这样的库反序列化为Map结构的,可以采用以下方式处理。 假设有一个嵌套的Map结构,例如`Map<String, Object>`,其中可能包含多层嵌套的Map或其他集合类型,可以通过逐层访问的方式提取所需的值。下面是一个示例代码: ### 示例:访问嵌套Map中的值 ```java import java.util.Map; public class NestedMapExample { public static Object getNestedValue(Map<String, Object> map, String... keys) { Object current = map; for (String key : keys) { if (current instanceof Map) { current = ((Map<?, ?>) current).get(key); } else { return null; // 如果中间节点不是Map,则无法继续查找 } } return current; } public static void main(String[] args) { // 假设已经存在一个嵌套的Map结构 Map<String, Object> nestedMap = ...; // 初始化你的嵌套Map // 获取嵌套值 Object value = getNestedValue(nestedMap, "level1", "level2", "targetKey"); System.out.println("Value: " + value); } } ``` 此方法适用于已知键路径的情况[^1]。对于更复杂的动态结构,可以结合递归或流式操作进一步处理。 ### 处理复杂嵌套结构 如果嵌套结构包含列表(List)或其他复杂类型,需要在访问时进行类型检查和转换。例如: ```java public static Object getNestedValueWithListHandling(Object current, String... keys) { for (String key : keys) { if (current instanceof Map) { current = ((Map<?, ?>) current).get(key); } else if (current instanceof java.util.List) { // 假设列表中每个元素都是Map for (Object item : (java.util.List<?>) current) { if (item instanceof Map) { current = ((Map<?, ?>) item).get(key); break; // 仅取第一个匹配项,可根据需求调整逻辑 } } } else { return null; } } return current; } ``` 这种方法可以应对包含列表的复杂嵌套场景[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值