如何在Python中扁平化包含多层嵌套数组的JSON结构?
解决方案
方案1:使用pandas.json_normalize(固定结构场景推荐)
你之前用json_normalize没有成功,大概率是没有正确指定多层嵌套数组的record_path参数和上层需要保留的元字段meta参数。针对你给出的JSON结构,实现代码如下:
import pandas as pd import json # 加载本地JSON文件,也可以直接传接口返回的JSON对象 with open("your_json_file.json", "r", encoding="utf-8") as f: raw_data = json.load(f) # 示例为按最细粒度upstreamTables展开,每行对应一个表,保留所有上层关联字段 df = pd.json_normalize( raw_data["data"]["workbooks"], # 嵌套数组的层级路径,从当前workbook层级往下定位 record_path=["embeddedDatasources", "upstreamTables"], # 需要保留的上层字段,嵌套结构用列表指定层级 meta=[ "projectName", ["site", "name"], "createdAt", "updatedAt", ["owner", "name"], ["owner", "username"], ["embeddedDatasources", "name"], ["embeddedDatasources", "upstreamDatasources", 0, "owner", "username"] ], # 自定义扁平化后字段的分隔符,默认是点,这里改成下划线更易读 sep="_" ) # 可以直接导出为Excel/CSV,或者转成字典列表使用 print(df.head()) flat_records = df.to_dict("records")
这个方案性能更高,输出字段完全可控,适合JSON结构固定的业务场景。
方案2:通用递归扁平化(结构不固定场景推荐)
如果你的JSON结构经常变动,不需要提前知道字段层级,可以用通用递归函数实现任意嵌套JSON的全量扁平化:
def flatten_json(nested_json, parent_key='', sep='_'): items = {} for k, v in nested_json.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k if isinstance(v, dict): items.update(flatten_json(v, new_key, sep=sep)) elif isinstance(v, list): records = [] base_item = items.copy() for elem in v: if isinstance(elem, (dict, list)): flat_elem = flatten_json(elem, new_key, sep=sep) records.append({**base_item, **flat_elem}) else: records.append({**base_item, new_key: elem}) return records else: items[new_key] = v return items # 使用示例 with open("your_json_file.json", "r", encoding="utf-8") as f: raw_data = json.load(f) flat_result = flatten_json(raw_data)
内容的提问来源于stack exchange,提问作者lsr
相关产品推荐
相关产品推荐

