【问题标题】:JSONRenderer won't serialize: b'{"id":"11122211133311"}' is not JSON serializableJSONRenderer 不会序列化:b'{"id":"11122211133311"}' 不是 JSON 可序列化的
【发布时间】:2015-10-02 23:17:17
【问题描述】:

我在使用 JSONRenderer 序列化对象时遇到问题。

我正在使用django-rest-framework 并且我已经序列化了对象:

  pk = kwargs['pk']
  tube = Tube.objects.get(id=pk)

  serialized_tube = TubeSerializer(tube)

serialized_tube.data 看起来像这样:

{'id': '11122211133311'}

很遗憾,我无法使用 JSONRenderer 序列化它,因为代码

  tube_json = JSONRenderer().render(serialized_tube.data)
  return Response(tube_json)

给出以下错误

b'{"id":"11122211133311"}' 不是 JSON 可序列化的

  tube_json = json.dumps(serialized_tube.data)
  return Response(tube_json)

效果很好……

我正在使用 Python3.4.3

【问题讨论】:

  • 错误信息b'{"id":"11122211133311"}' is not JSON serializable表明serialized_tube.data已经是json序列化了(你已经有了一个字符串)
  • 很奇怪,因为我只是在跟着这个教程:django-rest-framework.org/tutorial/1-serialization

标签: json django serialization django-rest-framework


【解决方案1】:

问题不在于您的JSONRenderer() 行,而在于您将其作为Response 返回的行。

Django REST 框架提供了一个自定义的Response 对象,该对象将自动呈现为任何接受的渲染器,将原生 Python 结构转换为渲染版本(在本例中为 JSON 结构)。所以Python字典会转成JSON对象,Python列表会转成JSON数组等等。

现在您正在将数据序列化为 JSON 字符串然后将其传递给 Response,您希望将其重新序列化为 JSON。您无法将字符串序列化为 JSON(您需要一个对象或数组来包装它),这就是您看到错误的原因。

解决办法是不要提前调用JSONRenderer,直接把序列化器数据传给Response

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2013-04-26
    • 1970-01-01
    • 2018-09-12
    • 2019-06-17
    相关资源
    最近更新 更多