【问题标题】:json object returned by http responsehttp响应返回的json对象
【发布时间】:2017-04-05 03:24:58
【问题描述】:

我正在使用 python 和 django 开发一些 REST API。我对 requests 调用返回的 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 记录的正确方法是什么。

【问题讨论】:

  • 我有点困惑 - requests.get 与 django 或 requests 有关?

标签: python json django unicode python-requests


【解决方案1】:

你是对的,resp.json() 确实为你调用了json.loads()

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

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

【讨论】:

  • 对。所以在django这边,返回的数据是data = serializers.serialize("json", types) return Response(data)
  • @Luca Django 也有一个JsonResponse,你可以直接传递像字典或列表这样的对象。
  • 如果 Response 来自 DRF,那么它将为您序列化;正如 DRF 文档所指出的,您应该传入 Python 原语(例如字典和列表)而不是已经渲染的 JSON。使用标准的 HttpResponse,或者使用 DRF 的序列化器而不是 Django 的序列化器。
  • @Luca Daniel Roseman 的建议。 (DRF = django-rest-framework) 如果您正在构建 API,您绝对应该考虑它。
  • 再次感谢大家。我能够使用 DRF 的 Serializer 课程并在此过程中学到新的东西!
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多