http响应返回的json对象

Luc*_*uca 4 python django unicode json python-requests

我正在使用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())
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以迭代条目:

for o in obj:
    print o
Run Code Online (Sandbox Code Playgroud)

这打印如下:

{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'}}
Run Code Online (Sandbox Code Playgroud)

但是,我读到resp.json()调用应该在json.loads()内部调用此方法,并将处理编码的东西.但是,只是做:

obj = resp.json()
for o in obj:
    print o
Run Code Online (Sandbox Code Playgroud)

只需迭代unicode字符串中的每个字符.loads如果我想迭代JSON条目,我应该再次通过该方法运行它吗?迭代返回的所有返回的JSON记录的正确方法是什么resp.json().

Ala*_*air 5

你是对的,resp.json()json.loads()你.

因此,如果resp.json()返回一个字符串,那么这表明API已经json对数据进行了两次编码.例如,它返回"{\"pk\": 1}"而不是{"pk": 1}.

如果您对API没有任何控制权,那么您必须对其进行两次解码才能获得Python对象.

  • 如果响应来自DRF,那么它将为您序列化事物; 正如DRF文档所述,您应该传递Python原语(例如dicts和列表)而不是已经呈现的JSON.使用标准的HttpResponse,或使用DRF的序列化器而不是Django序列化器. (2认同)