使用pandas json_normalize处理不一致嵌套JSON数据的报错解决
解决pandas json_normalize处理含null嵌套结构的TypeError问题
问题原因
当JSON条目里的Ats字段为null时,json_normalize的路径参数["Ats", "Ats"]会先尝试访问第一个Ats(即null),然后试图迭代它来提取子级Ats,直接触发TypeError: 'NoneType' object is not iterable。这里的errors='ignore'无法生效,因为它仅处理路径不存在的场景,而非路径节点为null且需要迭代的情况。
解决方案1:预处理JSON数据
遍历原始数据,将Ats为null的条目替换为包含空列表的结构,让json_normalize可以正常迭代:
import json import pandas as pd data = """[ { "ID": "100", "Ats": { "Ats": [ { "Name": "At1", "Desc": "Lazy At" } ] } }, { "ID": "101", "Ats": null } ]""" data = json.loads(data) # 预处理:将Ats为null的条目替换为{"Ats": []} for item in data: if item.get("Ats") is None: item["Ats"] = {"Ats": []} df = pd.json_normalize(data, ["Ats", "Ats"], "ID", errors='ignore') print(df)
输出结果:
Name Desc ID 0 At1 Lazy At 100 1 NaN NaN 101
解决方案2:手动提取构建DataFrame
如果不想修改原始数据,可以手动遍历每个条目,提取所需字段,灵活处理null场景:
import json import pandas as pd data = """[ { "ID": "100", "Ats": { "Ats": [ { "Name": "At1", "Desc": "Lazy At" } ] } }, { "ID": "101", "Ats": null } ]""" data = json.loads(data) records = [] for item in data: # 安全提取Ats列表,为空则返回空列表 ats_items = item.get("Ats", {}).get("Ats", []) if not ats_items: # 无数据时生成含NaN的记录 records.append({"ID": item["ID"], "Name": None, "Desc": None}) else: # 有数据时遍历拼接 for ats in ats_items: records.append({**ats, "ID": item["ID"]}) df = pd.DataFrame(records) print(df)
输出结果与方案1一致。
内容的提问来源于stack exchange,提问作者Payback
相关产品推荐
相关产品推荐

