Python调用REST API遇UTF-8 BOM解码错误,如何返回JSON数据?
解决REST API返回JSON时的UTF-8 BOM解析问题
看起来你踩了UTF-8 BOM的常见坑,我来帮你捋清楚问题出在哪,再给你几个靠谱的解决方案,尤其是符合你“尽量不用r.text”需求的方法。
为什么你的之前的尝试失败了?
先拆解一下你遇到的错误:
- 第一个方法里,
r.json()本身已经把响应内容解析成了Python对象(字符串、字典或列表),而decode()是bytes类型专属的方法,你拿字符串去调用它,自然会报bytes-like object is required, not 'str'的错误。 - 第二个方法里,
r.text已经是requests用默认的utf-8编码解码后的字符串了——这时候BOM字符已经被当成了字符串的一部分(比如开头的\ufeff),再用codecs.decode处理已经晚了,传给json.load时,JSON解析器会因为开头的无效字符报错。
正确的解决方案(优先推荐不用r.text的方法)
方案1:直接修改响应的编码(最简洁,符合你的需求)
requests的响应对象允许你手动指定编码,只要把encoding设为utf-8-sig,它就会自动处理BOM并正确解码:
r = wcapi.get("products") # 把响应编码设置为utf-8-sig,自动处理BOM r.encoding = 'utf-8-sig' # 直接调用json()解析,得到Python对象 data = r.json() print(data)
这样既不用碰r.text,也不用手动处理字节,完全符合你的要求。
方案2:手动处理原始字节内容
如果你想更底层一点操作,可以直接拿响应的原始字节r.content,先去掉BOM再解析:
import json r = wcapi.get("products") # 去掉开头的UTF-8 BOM字节序列 clean_content = r.content.lstrip(b'\xef\xbb\xbf') # 解析处理后的字节为JSON对象 data = json.loads(clean_content) print(data)
这个方法也避开了r.text,直接操作原始数据,适合需要更精细控制的场景。
额外小技巧
如果需要格式化输出让JSON数据更易读,可以用下面的代码:
print(json.dumps(data, indent=2, ensure_ascii=False))
内容的提问来源于stack exchange,提问作者Kiril Climson
相关产品推荐
相关产品推荐

