You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:26:10