使用urllib.request接收JSON的问题

时间:2015-09-18 18:49:33

标签: python json python-3.x

我一直在使用几个Web API,但这个让我感到困惑。我无法解决我的错误。

此代码适用于一个api,但不适用于此。

col-md-*

这给了我以下错误

response = urllib.request.urlopen(self.query_base)
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
return obj

我试过了:

UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f602' in position 4096: character maps to <undefined>

给出:

response = urllib.request.urlopen(self.query_base)
obj = json.load(response.decode("utf-8"))
return obj

AttributeError: 'HTTPResponse' object has no attribute 'decode'

给出了

response = urllib.request.urlopen(self.query_base).read()
obj = json.load(response)
return obj

AttributeError: 'bytes' object has no attribute 'read'

给出了

response = urllib.request.urlopen(self.query_base)
obj = json.load(response)

以及我在其他类似线程中找到的其他东西的组合

我以前不记得遇到过这个问题,我肯定错过了一些东西,但我看不清楚。

3 个答案:

答案 0 :(得分:0)

您的初始尝试已经正确。如果不是,则会出现解码错误。

相反,您有编码错误,从Unicode转回字节。这通常是由您使用print()或尝试将数据写入文件对象引起的。打印时,这通常是由您的控制台无法处理输出引起的。例如,请参阅python3 print unicode to windows xp console encode cp437

您的第二次尝试失败,因为您没有阅读回复,然后使用json.loads()(因为您现在传递了一个字符串):

response = urllib.request.urlopen(self.query_base)
obj = json.loads(response.read().decode("utf-8"))
#              ^         ^^^^^^^
return obj

您的第3次尝试确实使用了.read(),但您忘记解码该时间,并且再次没有使用json.loads()

response = urllib.request.urlopen(self.query_base).read()
#                          you didn't forget this ^^^^^^^
obj = json.loads(response.decode('utf-8'))
#              ^         ^^^^^^^^^^^^^^^^
return obj

最后一次尝试在原始响应中传递,而不解码数据。

答案 1 :(得分:0)

response = urllib.request.urlopen(self.query_base).read()
obj = json.loads(response)
return obj

此代码应该有效。 json.load希望从文件流中读取。从字符串中读取JSON时,您需要json.loads

答案 2 :(得分:0)

好的,只是让任何人有这个问题并稍后阅读这个帖子

response = urllib.request.urlopen(self.query_base)
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
return ascii(obj)

工作正常。

感谢Martijn Pieters