Map对象不是JSON可序列化的

时间:2015-11-29 23:32:40

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

返回在Django 1.7中添加的JSONResponse时会发生这种情况。并且是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')])

2 个答案:

答案 0 :(得分:21)

Python 3中的

map()是一个生成器函数,它在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)

答案 1 :(得分:1)

如果在使用map()时遇到此问题,则可以尝试使用list(map())解决此问题。