2015-11-29 3 views
4

Это происходит при возврате JSONResponse, который был добавлен в Django 1.7. и является оберткой вокруг json.dumps. Однако в этом случае возникает ошибка. Я уверен, что данные верны и могут быть сериализованы в JSON через оболочку Python.Объект карты не является сериализуемым 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')])

+1

Подходит ли 'OrderedDict' только пример данных или фактические данные, с которыми вы получаете сообщение об ошибке? –

+0

В этом я пропустил некоторые данные, которые вызывают ошибку. –

+1

Что такое '<объект карты в 0x7 ...>' в вашем коде? –

ответ

12

map() в Python 3 является функциональным генератором, который не является serializeable в формате 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)