Pandas调用json_normalize处理嵌套JSON时三级meta触发KeyError如何解决
问题原因
你写的三级嵌套meta路径格式本身符合json_normalize的要求,报错核心原因是返回的GraphQL数据中,部分条目不存在node -> organization -> company这条完整路径,比如部分node节点没有organization字段、或是organization下没有company字段,json_normalize默认遇到缺失路径就会抛出KeyError。
解决方案
1. 新增errors参数忽略缺失字段
直接在json_normalize参数中添加errors='ignore',缺失的字段会自动填充为NaN,不会中断执行:
nd = pd.json_normalize( res, record_path=["node", "events", "edges"], meta=[ ["node", "organization", "company"], ["node", "name"], ["node", "ip"], ["node", "id"], ["node", "deviceClass"] ], errors='ignore' )
如果执行后company字段全为NaN,建议先检查原始数据的字段名拼写、大小写是否和实际返回一致,确认是否有数据包含该字段。
2. 预处理原始数据补全字段
如果需要确保字段一定存在,可以提前遍历所有原始数据条目,补全缺失的嵌套结构,避免路径不存在:
for item in res: node = item.get("node", {}) # 补全organization结构 if "organization" not in node or not isinstance(node["organization"], dict): node["organization"] = {} if "company" not in node["organization"]: node["organization"]["company"] = None
预处理完成后再执行原来的json_normalize代码即可。
3. 分步骤解析再关联表
如果嵌套层级复杂,建议分两步解析再关联,逻辑更清晰也更容易排查问题:
# 提取设备基础信息 device_df = pd.json_normalize(res, record_path=["node"]) # 提取事件信息并关联设备id event_df = pd.json_normalize( res, record_path=["node", "events", "edges"], meta=[["node", "id"]] ) # 两个表按设备id关联得到最终结果 final_df = event_df.merge( device_df[["id", "organization.company", "name", "ip", "deviceClass"]], left_on="node.id", right_on="id", how="left" )
内容的提问来源于stack exchange,提问作者Chandhan Narayanareddy
相关产品推荐
相关产品推荐

