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

如何从Excel父子关系数据生成嵌套层级JSON文件?

问题:将Excel层级数据转换为嵌套JSON树形结构

我需要构建一个JSON文件来表示Excel表格中条目的层级结构。表格每行包含父元素code、自身code以及描述字段(描述内容不影响结构)。示例数据如下:

parent code description
A      A1   lorem ipsum
B      B1   lorem ipsum
C      C1   lorem ipsum
A      A2   lorem ipsum
B1     B11  lorem ipsum
A2     A21  lorem ipsum
B11    B112 lorem ipsum
B           lorem ipsum
...

我期望生成的JSON格式如下:

[
    { "code": "A", "description": "Lorem Ipsum", "childs": [
        { "code": "A1", "description": "Lorem Ipsum" },
        { "code": "A2", "description": "Lorem Ipsum", "childs": [
            { "code": "A21", "description": "Lorem Ipsum" }
        ] }
    ] },
    { "code": "B", "description": "Lorem Ipsum", "childs": [
        { "code": "B1", "description": "Lorem Ipsum", "childs": [
            { "code": "B11", "description": "Lorem Ipsum", "childs": [...] }
        ] }
    ] },
    ...
]

我尝试了多种方法,但始终搞不懂如何处理这种嵌套架构,而且条目层级数量不固定。请问有什么实现建议?


实现思路与步骤

处理这种可变层级的树形结构,核心是用字典映射所有节点,通过父code快速找到对应的父节点,然后将子节点挂载上去。这样不管层级有多深,都能高效构建结构,步骤如下:

1. 解析Excel数据,整理为节点对象

首先把Excel每行数据转换成包含parent_code、code、description的字典/对象,注意处理像示例中B那行没有子code的情况(这行是根节点B的描述信息)。

2. 用字典存储所有节点的引用

创建一个node_map字典,key是节点的code,value是节点对象(包含code、description、childs数组)。这样我们可以通过code快速定位任意节点,不用递归查找父节点,效率更高。

3. 逐步构建树形结构

遍历所有解析后的节点:

  • 如果节点的parent_code为空或不存在(比如根节点),则将其加入最终的根节点列表;
  • 如果parent_code存在于node_map中,就把当前节点添加到父节点的childs数组里;
  • 特殊情况处理:如果某个父节点还没被创建(比如先遇到子节点,后遇到父节点),可以先创建一个空的父节点占位,后续遇到父节点数据时再补充描述信息。

4. 转换为JSON格式

最后把根节点列表转换成JSON格式即可。

代码示例(Python)

import json

# 模拟解析后的Excel数据(实际开发中可使用pandas/openpyxl读取Excel)
excel_data = [
    {"parent": "A", "code": "A1", "description": "lorem ipsum"},
    {"parent": "B", "code": "B1", "description": "lorem ipsum"},
    {"parent": "C", "code": "C1", "description": "lorem ipsum"},
    {"parent": "A", "code": "A2", "description": "lorem ipsum"},
    {"parent": "B1", "code": "B11", "description": "lorem ipsum"},
    {"parent": "A2", "code": "A21", "description": "lorem ipsum"},
    {"parent": "B11", "code": "B112", "description": "lorem ipsum"},
    {"parent": None, "code": "B", "description": "lorem ipsum"},
    {"parent": None, "code": "A", "description": "lorem ipsum"},
    {"parent": None, "code": "C", "description": "lorem ipsum"},
]

node_map = {}
root_nodes = []

for item in excel_data:
    code = item["code"]
    parent_code = item["parent"]
    description = item["description"].title()  # 匹配示例中的首字母大写格式

    # 如果节点不在映射中,先初始化节点
    if code not in node_map:
        node_map[code] = {"code": code, "description": description, "childs": []}
    else:
        # 若节点已存在(比如之前作为父节点占位),补充描述信息
        node_map[code]["description"] = description

    current_node = node_map[code]

    if parent_code is None or parent_code == "":
        # 根节点,加入根节点列表
        root_nodes.append(current_node)
    else:
        # 处理父节点:如果父节点未创建,先占位
        if parent_code not in node_map:
            node_map[parent_code] = {"code": parent_code, "description": "", "childs": []}
        # 将当前节点挂载到父节点的子列表中
        node_map[parent_code]["childs"].append(current_node)

# 转换为格式化的JSON并输出
tree_json = json.dumps(root_nodes, indent=4)
print(tree_json)

关键优势

  • 线性遍历即可完成构建,时间复杂度为O(n),效率极高;
  • 自动处理节点出现顺序的问题(比如子节点先于父节点出现的情况);
  • 逻辑清晰,容易调试和扩展,比如后续要添加更多字段只需修改节点初始化逻辑。

内容的提问来源于stack exchange,提问作者Philipp K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:52:34