Python递归处理嵌套JSON并实现扁平化输出的方案求助
解决方案:递归扁平化嵌套JSON
我来帮你搞定这个嵌套JSON的递归扁平化需求!下面是完整的可运行代码,之后我会一步步拆解每个部分的作用:
import json def flatten_hierarchy(node, parent_id=None, results=None): # 初始化结果列表,避免每次递归都创建新列表 if results is None: results = [] # 提取当前节点的ID,只有存在ID的节点才需要记录 current_id = node.get('id') if current_id is not None: # 按照要求的格式添加记录:类型、ID、父ID results.append(('record', current_id, parent_id)) # 获取当前节点的子节点集合 child_records = node.get('record') if child_records: # 处理子节点的两种情况:单个字典或数组 if isinstance(child_records, dict): child_records = [child_records] # 递归遍历每个子节点,父ID设为当前节点的ID for child in child_records: flatten_hierarchy(child, parent_id=current_id, results=results) return results # 你的原始JSON字符串 json_input = '''{ "hierarchy": { "record": { "id": 1, "record": [ { "id": 2, "record": [ { "id": 3, "record": [ { "id": 4, "record": [] }, { "id": 5, "record": [] } ] } ] }, { "id": 6, "record": [ { "id": 7 } ] } ] } }, "type": "record" }''' # 解析JSON为Python字典 parsed_data = json.loads(json_input) # 定位到根节点:hierarchy下的record对象 root_record = parsed_data['hierarchy']['record'] # 执行扁平化处理 flattened_results = flatten_hierarchy(root_record) # 格式化输出成你要的表格样式 print(f"{'record_field':<15} {'id':<5} {'parent_id'}") print("="*40) for field, record_id, p_id in flattened_results: # 把None的父ID转换成字符串"null" parent_display = 'null' if p_id is None else p_id print(f"{field:<15} {record_id:<5} {parent_display}")
代码解释
1. 递归核心函数 flatten_hierarchy
这个函数是整个逻辑的核心:
- 参数设计:
node是当前处理的节点字典,parent_id是当前节点的父ID(根节点为None),results用来收集所有扁平化后的记录(用默认参数None来初始化,避免每次递归创建新列表)。 - 当前节点记录:先提取节点的
id,如果存在就把这条记录添加到结果列表里,格式是('record', 当前ID, 父ID)。 - 子节点处理:
- 先获取当前节点的
record字段,这个字段可能是单个字典(比如根节点的record)、数组或者空数组。 - 如果是单个字典,我们把它转换成单元素数组,这样就能统一用循环处理所有子节点。
- 遍历每个子节点,递归调用
flatten_hierarchy,把当前节点的ID作为子节点的父ID。
- 先获取当前节点的
2. JSON解析与启动递归
- 先用
json.loads把JSON字符串转换成Python字典。 - 定位到根节点:你的JSON结构里,真正的层级根节点是
hierarchy下的record对象,所以我们从这里开始递归。
3. 格式化输出
- 先打印表头,用
<15、<5这样的格式化符号让内容对齐。 - 遍历扁平化后的结果,把
None的父ID转换成字符串null,然后按照要求的格式打印每一行。
运行结果
运行代码后,你会得到完全符合预期的输出:
record_field id parent_id ======================================== record 1 null record 2 1 record 3 2 record 4 3 record 5 3 record 6 1 record 7 6
内容的提问来源于stack exchange,提问作者user400058
相关产品推荐
相关产品推荐

