根据链式键从JSON对象中获取值

本文介绍了两个Java方法,分别是递归地获取指定key的值和根据链式键在JSON对象中查找值。方法`getValueLoop`用于遍历JSON对象,而`getValueChain`则支持处理链式键,如`aa[0].aaa`。
摘要由CSDN通过智能技术生成
  • 递归获取指定key的值

     /**
         * 递归获取指定key的值
         *
         * @param json 待查询的json对象
         * @param key  需要查询的key
         * @return 查询到的值,如果key不存在或者值为null,则返回null
         */
        public static Object getValueLoop(JSONObject json, String key) {
            if (json == null || key == null) {
                return null;
            }
            // 如果当前json包含此key,则直接返回
            if (json.containsKey(key)) {
                return json.get(key);
            }
            for (Map.Entry<String, Object> entry : json.entrySet()) {
                Object value = entry.getValue();
                if (value instanceof JSONObject) {
                    Object result = getValueLoop(JSON.parseObject(value.toString()), key);
                    if (result != null) {
                        return result;
                    }
                } else if (value instanceof JSONArray) {
                    JSONArray jsonArray = (JSONArray) value;
                    for (int i = 0; i < jsonArray.size(); i++) {
                        Object result = getValueLoop(jsonArray.getJSONObject(i), key);
                        if (result != null) {
                            return result;
                        }
                    }
                }
            }
            return null;
        }

  •  根据链式键获取值

/**
     * 从JSON对象中根据链式键获取值。
     *
     * @param json 要搜索的JSON对象。
     * @param chainKey 链式键,使用"."分隔多层键,支持数组访问(如:key[0])。
     * @return 根据链式键找到的值,如果找不到或参数无效则返回null。
     */
    public static Object getValueChain(JSONObject json, String chainKey) {

        // 检查输入参数是否有效
        if (json == null || chainKey == null) {
            return null;
        }

        Object result = json;

        // 分割链式键为单个键名
        String[] keys = chainKey.split("\\.");

        for (String key : keys) {
            if (key.contains("[") && key.contains("]")) {
                // 处理数组访问形式的键
                String[] keyArray = key.split("\\[");
                JSONArray array = (JSONArray) getValueLoop(JSONObject.parseObject(result.toString()), keyArray[0]);
                if (array == null) {
                    return null;
                }
                int index = Integer.parseInt(keyArray[1].replace("]", ""));
                if (array.size() < index) return null;

                result = array.getJSONObject(index);  // 获取指定索引的JSON对象

            } else {
                // 处理普通键
                result = getValueLoop(JSONObject.parseObject(result.toString()), key);
            }
        }

        return result;
    }
  • 测试

    public static void main(String[] args) {
            String json = "{\"aa\":[{\"aaa\":\"111\"}]}";
    
            System.out.println(JsonUtils.getValueChain(JSONObject.parseObject(json), "aa[0].aaa"));
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值