🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

JSON对象的递归解析方法

🌐 通用解析逻辑

💻 多语言实现示例

✅ Python(简洁清晰)

✅ Java(使用 org.json 库)

🔍 高级应用:按路径表达式精准取值(Java + Gson)

⚠️ 关键注意事项

🌟 典型应用场景


img

JSON对象的递归解析方法

JSON的嵌套特性(对象中包含对象/数组)决定了递归是解析复杂JSON结构最自然高效的方式。核心思想:根据元素类型分支处理,遇到嵌套结构时自我调用。

🌐 通用解析逻辑

1. 判断当前元素类型
   ├─ 对象(Object/Dict)→ 遍历键值对,对每个值递归
   ├─ 数组(Array/List)→ 遍历每个元素,对每个元素递归
   └─ 基础类型(String/Number/Boolean/Null)→ 直接处理
2. 递归终止条件:遇到非容器类型

💻 多语言实现示例

✅ Python(简洁清晰)

import json

def parse_json(data, path=""):
    """带路径追踪的递归解析"""
    if isinstance(data, dict):
        for key, value in data.items():
            new_path = f"{path}.{key}" if path else key
            if isinstance(value, (dict, list)):
                parse_json(value, new_path)
            else:
                print(f"{new_path} = {value}")
    elif isinstance(data, list):
        for idx, item in enumerate(data):
            parse_json(item, f"{path}[{idx}]")
    # 基础类型已在上层处理,此处可省略else

# 使用示例
json_str = '''
{
  "user": "张三",
  "profile": {"age": 30, "city": "北京"},
  "skills": ["Java", "Python", {"tool": "Git"}]
}'''
parse_json(json.loads(json_str))

输出

user = 张三
profile.age = 30
profile.city = 北京
skills[0] = Java
skills[1] = Python
skills[2].tool = Git

✅ Java(使用 org.json 库)

import org.json.*;

public class JsonRecursiveParser {
    // 遍历JSONObject
    private static void traverseObj(JSONObject obj, String path) {
        for (String key : obj.keySet()) {
            String currPath = path.isEmpty() ? key : path + "." + key;
            Object val = obj.get(key);
            
            if (val instanceof JSONObject) {
                traverseObj((JSONObject) val, currPath);
            } else if (val instanceof JSONArray) {
                traverseArr((JSONArray) val, currPath);
            } else {
                System.out.println(currPath + " = " + val);
            }
        }
    }
    
    // 遍历JSONArray
    private static void traverseArr(JSONArray arr, String path) {
        for (int i = 0; i < arr.length(); i++) {
            Object item = arr.get(i);
            String currPath = path + "[" + i + "]";
            
            if (item instanceof JSONObject) traverseObj((JSONObject) item, currPath);
            else if (item instanceof JSONArray) traverseArr((JSONArray) item, currPath);
            else System.out.println(currPath + " = " + item);
        }
    }
    
    public static void main(String[] args) {
        String json = "{\"name\":\"李四\",\"hobbies\":[\"读书\",{\"sport\":\"篮球\"}]}";
        traverseObj(new JSONObject(json), "");
    }
}

🔍 高级应用:按路径表达式精准取值(Java + Gson)

// 示例路径: "root[0].elementBs[1].elementName"
public static JsonElement getElementByPath(JsonElement json, String path) {
    String[] parts = path.split("\\.");
    JsonElement current = json;
    
    for (String part : parts) {
        if (part.contains("[")) {
            // 处理数组索引: elementBs[1]
            String key = part.substring(0, part.indexOf('['));
            int idx = Integer.parseInt(part.substring(part.indexOf('[')+1, part.indexOf(']')));
            current = current.getAsJsonObject().get(key).getAsJsonArray().get(idx);
        } else {
            current = current.getAsJsonObject().get(part);
        }
    }
    return current;
}
// 返回: "testName2" (对应知识库[7]示例)

⚠️ 关键注意事项

问题 解决方案
栈溢出风险 超深嵌套时改用迭代+显式栈(如Deque)
循环引用 标准JSON无此问题,但某些库扩展支持时需记录已访问节点
性能优化 大型JSON可结合流式解析(如Jackson Streaming API)
路径追踪 递归时传递当前路径参数(如示例所示)
错误处理 始终包裹try-catch(JSONDecodeError/JSONException)

🌟 典型应用场景

  • 🔍 全量扫描:提取所有键值对(日志分析、数据审计)
  • 🎯 精准定位:按a.b[2].c路径获取值(配置解析)
  • 📦 动态解析:处理结构未知的JSON(API通用适配器)
  • ✂️ 数据拆分:按长度递归分割大JSON数组(知识库[2])
  • 🔄 结构转换:转为扁平Map/其他格式(知识库[8])

💡 最佳实践

  • 简单场景 → 用内置库递归(Python json / Java org.json
  • 复杂需求 → 选专业库(Java: Jackson/Gson;Python: jsonpath-ng
  • 超大JSON → 优先考虑流式解析避免内存溢出

递归解析将JSON的树状结构转化为线性处理流程,是掌握JSON深度处理的核心技能!

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐