You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:50:15