pandas.json_normalize处理单条requests返回JSON报错排查
问题成因
- 核心错误是对
pandas.json_normalize的入参类型理解错误:该方法要求传入的是已经完成反序列化的Python对象(字典、字典列表),不会自动对传入的JSON格式字符串做解析。你直接传入response.text(原始字符串类型)时,方法会将字符串按字符迭代处理,必然触发格式报错。 - 手动拼接
f"[{response.text}]"仍然失败的原因很简单:拼接后得到的依然是字符串类型,并没有完成JSON到Python对象的转换,本质和直接传response.text没有区别。 - 你提到的「导出本地文件加[]后可正常解析」,是因为读取本地JSON文件时(无论用
pandas.read_json还是json.load),方法会自动完成字符串到Python对象的反序列化流程,和直接给json_normalize传原始字符串的执行逻辑完全不同。
正确实现方式
不需要手动拼接数组括号,直接先将接口返回的JSON字符串反序列化为Python对象,再传入json_normalize即可,两种常用写法如下:
写法1:使用requests内置的JSON解析方法(最简便)
requests响应对象自带json()方法,可以直接把返回内容解析为Python字典,直接传入即可,单条字典对象json_normalize可以直接处理,无需包裹为列表:
import requests import pandas as pd url = "https://api.namefake.com/portuguese-brazil/" response = requests.get(url) # 直接解析响应为Python字典 data = response.json() df = pd.json_normalize(data)
写法2:使用标准库json模块手动解析
如果需要对JSON字符串做自定义处理后再解析,可以用json.loads完成反序列化:
import requests import pandas as pd import json url = "https://api.namefake.com/portuguese-brazil/" response = requests.get(url) # 手动将JSON字符串加载为Python对象 data = json.loads(response.text) # 如果确实需要转为数组格式再处理也可以,非必须 # data = json.loads(f"[{response.text}]") df = pd.json_normalize(data)
注意:不要把Python交互环境中打印
response.text时首尾自动展示的单引号当成响应内容的一部分,这两个单引号是REPL环境标记字符串边界的展示符号,不属于接口返回的实际内容,不需要额外处理。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

