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

Pandas json_normalize处理含null值JSON报错的解决方法咨询

解决pandas json_normalize处理含null的嵌套JSON时的KeyError问题

你遇到的这个问题其实是不同pandas版本对json_normalize的处理逻辑差异导致的——pandas 0.20.3对嵌套字典中值为null的字段兼容性更好,而0.23.0的版本在这种场景下存在一个小bug,导致抛出KeyError。你的字符串替换方案虽然能临时解决,但确实不够优雅,这里给你几个更靠谱的解决方案:

方案1:手动展开嵌套字段(最兼容,推荐)

避开json_normalize的潜在问题,自己手动处理嵌套的address字段,这种方式在所有pandas版本中都能稳定运行:

import json
import pandas as pd

text = """ [{ "id":"1", "name" : "abc", "address":{ "flat":"123", "city":"paris", "street":null }, "error":null }] """

# 加载JSON数据
resp_json = json.loads(text)

# 先把顶层数据转为DataFrame
df = pd.DataFrame(resp_json)
# 把嵌套的address字段单独转为DataFrame
address_df = pd.DataFrame(df['address'].tolist())
# 合并两个DataFrame,删除原有的address列
final_df = pd.concat([df.drop('address', axis=1), address_df], axis=1)

# 如果需要把null转为空字符串,可以加上这一行
final_df = final_df.fillna('')

这种方法会自动把嵌套字典里的所有键转为列,不管值是null还是缺失,都会统一填充为NaN(或者你指定的空字符串),完全不会触发KeyError。

方案2:预处理JSON数据,确保字段存在

如果一定要用json_normalize,可以在加载JSON后先预处理嵌套字典,确保street字段始终存在(哪怕值是None):

from pandas.io.json import json_normalize
import json
import pandas as pd

text = """ [{ "id":"1", "name" : "abc", "address":{ "flat":"123", "city":"paris", "street":null }, "error":null }] """

resp_json = json.loads(text)

# 预处理每个item的address字段,确保street存在
for item in resp_json:
    # 用get方法获取street,不存在则返回None,存在则保留原值
    item['address']['street'] = item['address'].get('street', None)

# 再调用json_normalize
response = json_normalize(resp_json)

这种方式修复了0.23.0版本中json_normalize对存在但值为null的字段的处理bug,让它能正常解析。

方案3:升级pandas版本(如果允许的话)

这个问题在pandas后续的版本(比如0.24+)中已经被修复了,如果你的生产环境允许升级pandas,直接升级到较新的稳定版本,就能直接用原来的代码而不会报错。

内容的提问来源于stack exchange,提问作者SCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:05:05