You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:05:15