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
相关产品推荐
相关产品推荐

