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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:25