41 votes

Comment sérialiser en JSON un dictionnaire Python ?

J'essaie de créer une fonction Django pour sérialiser quelque chose en JSON et le renvoyer dans un fichier HttpResponse objet.

def json_response(something):
    data = serializers.serialize("json", something)
    return HttpResponse(data)

Je l'utilise comme suit :

return json_response({ howdy : True })

Mais j'obtiens cette erreur :

"bool" object has no attribute "_meta"

Des idées ?

EDIT : Voici le traceback :

http://dpaste.com/38786/

65voto

Simon Willison Points 4091

Mise à jour : Python a maintenant son propre gestionnaire json, il suffit d'utiliser import json au lieu d'utiliser simplejson .


Le module Django serializers est conçu pour sérialiser les objets ORM de Django. Si vous voulez encoder un dictionnaire Python ordinaire, vous devriez utiliser simplejson, qui est fourni avec Django au cas où vous ne l'auriez pas déjà installé.

import json

def json_response(something):
    return HttpResponse(json.dumps(something))

Je suggère de le renvoyer avec un en-tête Content-Type application/javascript (vous pourriez également utiliser application/json mais cela vous empêcherait de déboguer dans votre navigateur) :

import json

def json_response(something):
    return HttpResponse(
        json.dumps(something),
        content_type = 'application/javascript; charset=utf8'
    )

32voto

Filippo Points 1964

Qu'en est-il d'un JsonResponse Classe qui étend HttpResponse :

from django.http import HttpResponse
from django.utils import simplejson

class JsonResponse(HttpResponse):
    def __init__(self, data):
        content = simplejson.dumps(data,
                                   indent=2,
                                   ensure_ascii=False)
        super(JsonResponse, self).__init__(content=content,
                                           mimetype='application/json; charset=utf8')

15voto

Dmitrii Mikhailov Points 2467

Avec les versions plus récentes de Django, vous pouvez simplement utiliser JsonResponse fourni par django.http :

from django.http import JsonResponse

def my_view(request):
    json_object = {'howdy': True}
    return JsonResponse(json_object)

Vous trouverez plus de détails dans le documents officiels .

5voto

Salvador Dali Points 11667

Dans python 2.6 et plus, il y a une jolie fonction Bibliothèque JSON qui a de nombreuses fonctions, parmi lesquelles json.dumps() qui sérialise un objet en une chaîne de caractères.

Vous pouvez donc faire quelque chose comme ça :

import json
print json.dumps({'howdy' : True })

1voto

Waqas Points 1008
import json

my_list = range(1,10) # a list from 1 to 10

with open('theJsonFile.json', 'w') as file_descriptor:

         json.dump(my_list, file_descriptor) #dump not dumps, dumps = dump-string

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X