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

当我们遇到复杂嵌套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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用递归函数来获取json的所有key和value,以下是一个Python实现的示例代码: ```python def get_all_keys_values(json_data): all_keys = [] all_values = [] if isinstance(json_data, dict): for key, value in json_data.items(): all_keys.append(key) if isinstance(value, dict) or isinstance(value, list): sub_keys, sub_values = get_all_keys_values(value) all_keys.extend([f'{key}.{sub_key}' for sub_key in sub_keys]) all_values.extend(sub_values) else: all_values.append(value) elif isinstance(json_data, list): for item in json_data: sub_keys, sub_values = get_all_keys_values(item) all_values.extend(sub_values) all_keys.extend(sub_keys) return all_keys, all_values ``` 这个函数接收一个json数据作为参数,然后递归地遍历这个json数据,将所有的key和value分别存储在两个列表,并返回这两个列表。如果遇到嵌套的字典或列表,会递归调用这个函数来获取key和value。可以通过调用这个函数来获取一个json数据的所有key和value,例如: ```python import json json_data = '{"name": "John", "age": 30, "address": {"city": "New York", "state": "NY"}, "languages": ["English", "French"]}' data = json.loads(json_data) all_keys, all_values = get_all_keys_values(data) print(all_keys) print(all_values) ``` 输出结果为: ``` ['name', 'age', 'address.city', 'address.state', 'languages.0', 'languages.1'] ['John', 30, 'New York', 'NY', 'English', 'French'] ``` 注意:这个函数只适用于json数据没有重复的key的情况,如果有重复的key,可能会导致一些key的value被覆盖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值