我正在使用python和django开发一些REST API。我有一个关于请求调用返回的JSON unicode字符串的问题。所以,我正在做类似的事情:
resp = requests.get(self.url)
if resp.status_code is status.HTTP_200_OK:
obj = json.loads(resp.json())
有了这个,我可以迭代条目:
for o in obj:
print o
这打印如下:
{u'pk': 1, u'model': u'aslapp.imagetypemodel', u'fields': {u'type': u'PNG'}}
{u'pk': 2, u'model': u'aslapp.imagetypemodel', u'fields': {u'type': u'JPG'}}
但是,我读到resp.json()
调用应该在内部调用此json.loads()
方法,并将处理编码内容。但是,只是这样做:
obj = resp.json()
for o in obj:
print o
只是迭代unicode字符串中的每个字符。如果我想迭代JSON条目,我是否应该再次通过loads
方法运行它?迭代resp.json()
返回的所有JSON记录的正确方法是什么。
答案 0 :(得分:5)
您是对的,resp.json()
会为您致电json.loads()
。
因此,如果resp.json()
返回一个字符串,则表明该API已将json编码两次。例如,它返回"{\"pk\": 1}"
而不是{"pk": 1}
。
如果您无法控制API,那么您必须对其进行两次解码以获取Python对象。