递归获取复杂嵌套JSON(json长什么样并不能确定,但一定是对象Key-Value的形式)的所有Key和Value

直接上代码(递归有风险,栈太深会溢出,可考虑使用while代替)

 递归实现:

/**
     * @Auther: liuzujie
     * @Date: 2020/2/26 16:25
     * @Desc:
     * @return: 考虑嵌套中会有key重复的情况,所以用IdentityHashMap
     */
    public static IdentityHashMap getKeyVal(Object str, IdentityHashMap<String, Object> retMap) {
        JSONObject json;//alibaba.fastjson
        //JSON.parseObject只接受key-value形式,像【["直接是个数组", "没有key-value", "不是对象"]】这种需要转成JSONArray的不支持
        json = JSON.parseObject(str.toString());
        Set<String> keys = json.keySet();
        for (String key : keys) {
            Object value = json.get(key);
            if (isPriStr(value)) {
                retMap.put(new String(key), value);
            } else if (value instanceof JSONObject) {
                checkValue(value, retMap);
            } else if (value instanceof JSONArray) {
                JSONArray array = ((JSONArray) value);
                for (int i = 0; i < array.size(); i++) {
                    if (isPriStr(array.get(i))) {
                        retMap.put(new String(key), value);
                    } else {
                        checkValue(array.get(i), retMap);
                    }
                }
            }
        }
        return retMap;
    }

测试类:

/**
     * @Auther: liuzujie
     * @Date: 2020/2/26 16:35
     * @Desc: 测试类
     */
    public static void main(String[] args) {
        IdentityHashMap<String, Object> dd = new IdentityHashMap<>();
        getKeyVal("{\n" +
                "  \"name\": \"如果我是Dj\",\n" +
                "  \"age\": 26,\n" +
                "  \"test\": 3232,\n" +
                "  \"sb\": \"xiaoz\",\n" +
                "  \"list\": [\n" +
                "    {\n" +
                "      \"name\": \"你真的DJ吗\",\n" +
                "      \"age\": 333,\n" +
                "      \"test\": 333,\n" +
                "      \"sb\": \"alErt\",\n" +
                "      \"list\": [\n" +
                "        {\n" +
                "          \"name\": \"嗨起来\",\n" +
                "          \"age\": 333,\n" +
                "          \"test\": 333,\n" +
                "          \"sb\": \"scridpt\"\n" +
                "        }\n" +
                "      ]\n" +
                "    }\n" +
                "  ]\n" +
                "}", dd);
        System.out.println(dd);
    }

输出:

  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值