Python json.loads解析requests返回对象列表报TypeError问题
问题原因
报错的核心是混淆了requests响应方法的返回值类型,以及json模块两个核心方法的入参规则:
response.json()是requests内置的JSON反序列化方法,会自动把接口返回的JSON格式原始响应(字符串/字节流)转换成Python原生数据结构。你的接口返回的是JSON数组,因此response.json()执行后得到的直接是Pythonlist对象,不是未解析的JSON原始文本。json.loads()的入参要求是JSON格式的字符串、字节或字节数组,作用是把这类原始JSON内容反序列化为Python对象。你传入已经解析完成的list类型数据,自然会触发类型错误。json.dumps()的入参要求是Python原生数据结构,作用是把这类对象序列化为JSON格式字符串,因此传入response.json()返回的列表完全符合要求,能正常输出格式化结果。
其他开发者用json.loads()能正常运行,是因为他们传入的是response.text(原始响应字符串)或response.content(原始响应字节),这两类才是json.loads()支持的入参,和你传入已解析Python对象的场景完全不同。
修复方案
你不需要额外调用json.loads(),直接使用response.json()的返回值即可,修正后的参考代码:
import requests import json # 可选:关闭verify=False时弹出的不安全请求警告 from urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) def get_groups(url): response = requests.get(url + "/groups", verify=False) print("status code:", response.status_code) # 直接获取解析完成的列表数据 groups = response.json() print("JSON:\n") print(json.dumps(groups, indent=2)) # 后续直接操作groups列表即可,无需额外解析 for group in groups: print(f"群组ID: {group['id']}, 群组名: {group['name']}")
等价写法说明
以下三种写法最终拿到的结果完全一致,response.json()本质上就是封装了json.loads()处理原始响应的逻辑:
# 写法1:使用requests内置解析方法(推荐,最简洁) groups = response.json() # 写法2:手动传入原始响应字符串解析 groups = json.loads(response.text) # 写法3:手动传入原始响应字节解析 groups = json.loads(response.content)
这个报错和Python 3.10.2版本、接口返回的JSON内容格式无关,纯粹是重复解析+入参类型不匹配导致的。
内容的提问来源于stack exchange,提问作者Joseph Gagnon
相关产品推荐
相关产品推荐

