使用Python 3,我从URL请求json文档。response = urllib.request.urlopen(request)该response对象是一个类似文件的对象read和readline方法。通常,可以使用以文本模式打开的文件创建JSON对象。obj = json.load(fp)我想做的是:obj = json.load(response)但是,这不起作用,因为urlopen以二进制模式返回文件对象。当然,解决方法是:str_response = response.read().decode('utf-8')obj = json.loads(str_response)但这感觉很糟糕......有没有更好的方法可以将字节文件对象转换为字符串文件对象?或者我错过任何参数urlopen或json.load给出编码?
3 回答

料青山看我应如是
TA贡献1772条经验 获得超8个赞
HTTP发送字节。如果有问题的资源是文本,则通常通过Content-Type HTTP标头或其他机制(RFC,HTML meta http-equiv,...)指定字符编码。
urllib 应该知道如何将字节编码为字符串,但它太天真 - 它是一个可怕的动力不足和非Pythonic库。
Dive Into Python 3提供了有关情况的概述。
你的“解决方案”很好 - 虽然感觉不对,但这是正确的做法。

牧羊人nacy
TA贡献1862条经验 获得超7个赞
Python拯救的精彩标准库......
import codecs
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
适用于py2和py3。
添加回答
举报
0/150
提交
取消