Python JSON 解码错误 TypeError: 在字节对象上不能使用字符串模式。

3

你好,我正在使用Python编写一个用户友好的货币兑换应用程序,用于学校项目。但是在尝试解码汇率JSON时遇到了错误。

我正在使用以下代码:

import urllib.request
import json
(str) = "http://rate-exchange.appspot.com/currency?from=FRM&to=TO&q=AM";
(str) = (str.replace("FRM", "GBP"))
(str) = (str.replace("TO", "USD"))
url = (str.replace("AM", "20"))
f = urllib.request.urlopen(url)
data = (f.read(100))
print (data)
json_input = data
decoded = json.loads(json_input)
print ("conversion is: ", decoded["v"])

我得到的错误是:

b'{"to": "USD", "rate": 1.66215, "from": "GBP", "v": 33.243000000000002}'
Traceback (most recent call last):
File "C:\Users\jay\My Cubby\get qure.py", line 12, in <module>
decoded = json.loads(json_input)
File "C:\Python33\lib\json\__init__.py", line 309, in loads
return _default_decoder.decode(s)
File "C:\Python33\lib\json\decoder.py", line 352, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object

我在想,有没有人有什么办法可以修复这个错误?还是说有人之前见过这个错误? 提前感谢任何帮助。 J.Rymer

1个回答

12
在 Python 3 中,你需要将 urllib.request.urlopen() 返回的 bytes 解码为 Unicode 字符串:decode
decoded = json.loads(json_input.decode('utf8'))

这种做法是基于你正在使用的Web服务默认采用UTF-8的JSON编码。

如果不想进行假设,您可以检查响应的字符集:

f = urllib.request.urlopen(url)
charset = f.info().get_param('charset', 'utf8')
data = f.read()
decoded = json.loads(data.decode(charset))

谢谢您的快速回复!它百分之百地有效,所以谢谢 :) - jjr2000
第一个“decoded”代码片段在我的“Django-Rest-Framework”测试中起作用了。谢谢。 - Aaron Lelevier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接