地图对象 JSON 不可序列化
Map object is not JSON serializable
返回 Django 1.7 中添加的 JSONResponse
时会发生这种情况。并且是 json.dumps
的包装器。但是,在这种情况下,它会导致错误。我确定数据是正确的,可以序列化为 JSON 通过 Python shell.
将数据序列化为 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')])
map()
in 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)
如果有人在使用 map() 时遇到这个问题,你可以尝试使用 list(map()) 来解决这个问题。
返回 Django 1.7 中添加的 JSONResponse
时会发生这种情况。并且是 json.dumps
的包装器。但是,在这种情况下,它会导致错误。我确定数据是正确的,可以序列化为 JSON 通过 Python shell.
将数据序列化为 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')])
map()
in 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)
如果有人在使用 map() 时遇到这个问题,你可以尝试使用 list(map()) 来解决这个问题。