如何从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
相关产品推荐
相关产品推荐

