最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Python 3中如何处理嵌套JSON数据_使用json_normalize展开结构
时间:2026-06-18 08:37:03 编辑:袖梨 来源:一聚教程网
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) 看一眼原始结构再决定展开策略。
相关文章
- OpenAI 硬件路线图曝光:第一台硬件没有屏幕,手机 2027 上半年量产 07-31
- 国产大模型,贵到用不起 07-31
- 《王者荣耀》团战雷达解析-赛年标签含义详解 07-31
- 《逐鹿天下手游技能加点攻略》(技能加点策略大揭秘!一文教你玩转逐鹿天下!) 07-31
- 《王者荣耀》艾琳专精装解析-提升普攻与暴击率优势 07-31
- 怎样在Ubuntu VirtualBox中安装Windows 07-31