Python使用requests模块无法将response.text转为字典的问题
解决requests解析JSON时的UTF-8 BOM解码错误
问题根源
报错提示的JSONDecodeError是因为接口返回的JSON文本开头带有UTF-8 BOM(字节顺序标记),而requests默认的utf-8解码逻辑不会自动去除这个标记,导致JSON解析器无法识别有效格式。
两种可行的解决方法
方法1:手动用utf-8-sig解码响应内容
直接对响应的原始字节内容进行解码,再用json.loads解析:
import json import requests def my_function(): url = API_URI["test"] headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} r = requests.post(url, data=json.dumps(api), headers=headers) # 使用utf-8-sig解码,自动去除BOM标记 decoded_response = r.content.decode('utf-8-sig') print(decoded_response) # 解析为字典(注意不要用dict作为变量名,避免覆盖内置类型) result_dict = json.loads(decoded_response) return result_dict my_function()
方法2:设置requests响应的编码为utf-8-sig
直接修改响应对象的编码属性,让r.text和r.json()自动使用正确的解码方式:
import json import requests def my_function(): url = API_URI["test"] headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} r = requests.post(url, data=json.dumps(api), headers=headers) # 强制响应使用utf-8-sig编码解码 r.encoding = 'utf-8-sig' print(r.text) result_dict = r.json() return result_dict my_function()
额外注意点
- 不要用
dict作为变量名,它是Python的内置类型,容易引发意外问题,改用result_dict这类自定义名称更安全。 - 两种方法本质都是通过
utf-8-sig编码处理掉开头的BOM标记,确保JSON文本符合标准格式。
内容的提问来源于stack exchange,提问作者Mike C.
相关产品推荐
相关产品推荐

