【问题标题】:Map object is not JSON serializable地图对象不是 JSON 可序列化的
【发布时间】:2016-03-03 13:08:21
【问题描述】:

在返回 JSONResponse 时会发生这种情况,这是在 Django 1.7 中添加的。并且是json.dumps 的包装。但是,在这种情况下,它会导致错误。我确定数据是正确的,可以通过 Python shell 序列化为 JSON。

将数据序列化为 JSON 的正确方法是什么?

from django.http import JsonResponse
from collections import OrderedDict

data = OrderedDict([('doc', '546546545'), ('order', '98745'), ('nothing', '0.0')])

return JsonResponse(data) # doesn't work, JSONRenderer().render(data) works

导致此错误:

<map object at 0x7fa3435f3048> is not JSON serializable

print(data) 给出:

OrderedDict([('doc', '546546545'), ('order', '98745'), ('nothing', '0.0')])

【问题讨论】:

  • OrderedDict 是您提供的示例数据还是您遇到错误的实际数据?
  • 就是这样,我省略了一些导致错误的数据。
  • &lt;map object at 0x7...&gt; 在你的代码中做了什么?
  • 为了简化,我删除了一些部分,现在它被扩展了。
  • headers_prepared 添加到输出中

标签: python json django python-3.x jsonresponse


【解决方案1】:

map() 在 Python 3 中是一个生成器函数,它在 JSON 中是不可序列化的。您可以通过将其转换为列表来使其可序列化:

from django.http import JsonResponse
from collections import OrderedDict

def order(request):    
    bunch = OrderSerializer(Order.objects.all(), many=True)
    headers = bunch.data[0].keys()
    # consume the generator and convert it to a list here
    headers_prepared = list(map(lambda x: {'data': x} , headers))
    ordered_all = (('columns', headers_prepared), ('lines', bunch.data))
    data = OrderedDict(ordered_all)
    return JsonResponse(data)

【讨论】:

    【解决方案2】:

    如果有人在使用map()时遇到这个问题,你可以尝试使用list(map())来解决这个问题。

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 2013-05-23
      • 2015-02-24
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2018-08-16
      相关资源
      最近更新 更多