如何动态遍历JSON所有层级子节点,避免遗漏深层节点?
如何动态遍历嵌套JSON的所有子节点
我有如下嵌套结构的JSON数据,目前使用多层嵌套for循环读取子节点,但这种方式会遗漏更深层级的节点(例如Washroom下的子节点),请问是否有动态方法替代多层for循环来获取所有子节点?
我的JSON数据
data = { "areas": [ { "id": "1348828088398400836", "name": "Building A", "children": [ { "id": "1348828088398403213", "name": "Floor 1", "children": [ {"id": "1348828088398403214", "name": "Room 1", "children": []}, {"id": "1348828088398403215", "name": "Room 2", "children": []}, {"id": "1348828088398403216", "name": "Room 3", "children": []}, { "id": "1348828088398403217", "name": "Room 4", "children": [ { "id": "1348828088398407094", "name": "Washroom", "children": [], } ], }, ], } ], } ] }
当前读取代码(存在深层节点遗漏问题)
for i in data["areas"]: areaName = i["name"] for j in i["children"]: print("Name:", j["name"]) for k in j["children"]: print("Name:", k["name"]) for l in k["children"]: print("Name:", l["name"])
解决方案
方法1:递归遍历(最直观)
递归是处理嵌套结构的常用方式,只要节点有children就继续遍历:
def traverse_nodes(node): # 输出当前节点名称 print("Name:", node["name"]) # 递归遍历所有子节点 for child in node["children"]: traverse_nodes(child) # 启动遍历,先遍历areas里的所有根节点 for area in data["areas"]: traverse_nodes(area)
运行后会输出所有层级的节点名称,包括Building A、Floor 1、Room 1到4、Washroom。
方法2:迭代式深度优先遍历(避免递归深度限制)
如果嵌套层级极深,递归可能触发栈溢出,这时可以用栈实现深度优先遍历:
def traverse_depth_first(root_nodes): stack = root_nodes.copy() while stack: node = stack.pop() print("Name:", node["name"]) # 逆序添加子节点,保证遍历顺序和递归一致 stack.extend(reversed(node["children"])) traverse_depth_first(data["areas"])
方法3:迭代式广度优先遍历(按层级顺序输出)
如果需要按从顶层到底层的层级顺序输出,比如先所有建筑,再所有楼层,再所有房间,可以用队列实现广度优先:
from collections import deque def traverse_breadth_first(root_nodes): queue = deque(root_nodes) while queue: node = queue.popleft() print("Name:", node["name"]) queue.extend(node["children"]) traverse_breadth_first(data["areas"])
这三种方法都能动态处理任意深度的嵌套节点,不会遗漏深层内容。
内容的提问来源于stack exchange,提问作者user0404
相关产品推荐
相关产品推荐

