HoRain云--递归解析JSON的终极指南
本文介绍了JSON对象的递归解析方法,通过判断元素类型(对象、数组或基础类型)进行分支处理,遇到嵌套结构时自我调用。提供了Python和Java两种语言的实现示例,展示了带路径追踪的递归解析方式。文章还探讨了高级应用如按路径表达式精准取值,并指出了关键注意事项(栈溢出风险、循环引用等)和典型应用场景(全量扫描、精准定位等)。最后推荐了不同场景下的最佳实践工具,强调递归解析是处理复杂JSON结构的核

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
🔍 高级应用:按路径表达式精准取值(Java + Gson)

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/ Javaorg.json)- 复杂需求 → 选专业库(Java: Jackson/Gson;Python:
jsonpath-ng)- 超大JSON → 优先考虑流式解析避免内存溢出
递归解析将JSON的树状结构转化为线性处理流程,是掌握JSON深度处理的核心技能!
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐



所有评论(0)