
本文介绍使用 pandas.json_normalize 处理多层嵌套 JSON(如含列表的列表)的正确方法,通过指定 record_path 和 meta 参数,一步生成结构清晰、无冗余列的目标 DataFrame。
本文介绍使用 `pandas.json_normalize` 处理多层嵌套 json(如含列表的列表)的正确方法,通过指定 `record_path` 和 `meta` 参数,一步生成结构清晰、无冗余列的目标 dataframe。
在数据分析和 API 集成场景中,常需将深度嵌套的 JSON 响应(例如 Tableau REST API 返回的 workbook–datasource–table 层级结构)转换为规整的二维表格。直接调用 pd.json_normalize(json_data) 无法自动穿透多级嵌套路径,而手动循环提取再拼接又易出错、可维护性差。
pandas.json_normalize 提供了强大的嵌套解析能力,关键在于合理组合以下参数:
-
record_path:指定要展开为记录行的最深层嵌套列表路径(支持多级列表,如['embeddedDatasources', 'upstreamTables']); -
meta:指定需向上关联的父级字段名(如'name'表示 workbook 名),避免丢失上下文; -
meta_prefix:为meta字段添加前缀,防止与record_path中同名字段(如name)冲突,规避ValueError: Conflicting metadata。
以下是完整实现代码(适配您提供的 JSON 结构):
import pandas as pd
# 假设 resp 是 response.json() 的返回结果
# resp = {
# "workbooks": [ ... ]
# }
df = (
pd.json_normalize(
resp['workbooks'],
record_path=['embeddedDatasources', 'upstreamTables'],
meta='name',
meta_prefix='meta_'
)
.rename(columns={
'name': 'upstreamTables',
'meta_name': 'workbooks'
})
[['workbooks', 'upstreamTables']]
)
print(df)
✅ 输出效果完全匹配目标格式:
workbooks upstreamTables 0 WORKBOOK_A WORKBOOK_A_TABLE_A 1 WORKBOOK_A WORKBOOK_A_TABLE_B 2 WORKBOOK_A WORKBOOK_A_TABLE_C 3 WORKBOOK_B WORKBOOK_B_TABLE_A 4 WORKBOOK_B WORKBOOK_B_TABLE_B 5 WORKBOOK_B WORKBOOK_B_TABLE_C 6 WORKBOOK_B WORKBOOK_B_TABLE_D
⚠️ 注意事项:
- 空列表(如
"upstreamTables": [])会被自动跳过,无需额外过滤; - 若
meta字段本身是嵌套字典,可传入['parent', 'field']形式路径; -
record_path必须指向实际存在的列表,否则抛出KeyError;建议先用jsonpath-ng或print(resp['workbooks'][0].keys())探查结构; - 如需保留其他元信息(如 datasource ID),可将多个字段传入
meta元组,例如meta=['name', 'id']。
该方法简洁、向量化、可扩展,是处理生产级嵌套 JSON 的推荐实践。











