json_normalize比手写递归更可靠,因其专为展平嵌套结构设计,内置处理None、空列表、混合类型等边界情况,并按record_path和meta精准提取结构化记录与上下文字段。
json_normalize 比手写递归更可靠?因为它的设计目标就是把树状嵌套结构“压平”成二维表,而不是提取某个值或遍历所有节点。当你最终要喂给 pandas.DataFrame、导出 CSV 或做聚合分析时,json_normalize 直接产出列对齐的结构,避免了自己处理键冲突、空值对齐、列表长度不一致等隐性坑。
它内部自动处理:None 值填充、重复键的层级前缀、嵌套列表展开(可选)、多级路径映射——这些全是手写递归函数容易漏掉或逻辑错乱的地方。
json_normalize 的三个关键参数怎么选?核心是看原始 JSON 的顶层结构:
list(比如 API 返回的多个订单),直接传入该列表,data=your_list
dict,但你想展开其中某个嵌套字段(如 "orders"),用 record_path="orders",再配合 meta 提取外层字段(如 ["system_info.api_version"])"user.name")或想自定义列名,必须设 sep="_",否则默认的 . 会和路径分隔符冲突,导致列名解析失败默认情况下,json_normalize 遇到字段值为 list 时,只取第一个元素(类似 pd.json_normalize(..., max_level=0))。要完整展开,必须显式指定:
立即学习“Python免费学习笔记(深入)”;
record_path 指向那个列表字段(如 ["products"])meta 列出需要带下来的父级字段(如 ["order_id", "customer.name"])data["response"]["items"][0]["details"]),不能写字符串路径,得用 record_path=["response", "items", "details"]
漏掉 record_path 或路径写成字符串(如 "response.items.details"),结果就是空 DataFrame 或报 KeyError。
json_normalize 默认对缺失字段填 NaN,但如果你后续要进数据库或导出 Excel,NaN 可能引发问题。建议:
errors="ignore" 防止某条记录字段缺失导致整个解析中断fill_value 统一替换空值(如 fill_value="" 或 fill_value=None)int/str 混合的字段(如 "amount"),解析后手动调用 df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
最易忽略的是:当原始 JSON 中同一字段在不同记录里类型不一致(比如有时是 str,有时是 dict),json_normalize 会静默丢弃该字段的全部值——必须提前用 pd.json_normalize(..., max_level=1) 看一眼原始结构再决定展开策略。