2015-11-29 1 views
4

Cela se produit lors du renvoi d'un JSONResponse, qui a été ajouté dans Django 1.7. et est une enveloppe autour de json.dumps. Cependant, dans ce cas, il en résulte une erreur. Je suis sûr que les données sont correctes et peuvent être sérialisées en JSON via le shell Python.Objet de la carte n'est pas sérialisable JSON

Quelle est la bonne façon de sérialiser les données en 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 

résultats dans cette erreur:

<map object at 0x7fa3435f3048> is not JSON serializable 

print(data) donne:

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

+1

Est-ce que 'OrderedDict' vous avez donné juste un exemple de données ou les données avec lesquelles vous obtenez l'erreur? –

+0

C'est la chose, j'ai omis certaines données qui causaient l'erreur. –

+1

Qu'est-ce que '' dans votre code? –

Répondre

12

map() en Python 3 est une fonction de générateur, qui n'est pas serializeable JSON. Vous pouvez le rendre sérialisable en le convertissant en une liste:

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)