web-dev-qa-db-fra.com

Comment puis-je JSON sérialiser un dictionnaire Python?

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

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

Je l'utilise comme ceci:

return json_response({ howdy : True })

Mais je reçois cette erreur:

"bool" object has no attribute "_meta"

Des idées?

EDIT: Voici le traceback:

http://dpaste.com/38786/

41
Deniz Dogan

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


Le module Django serializers est conçu pour sérialiser les objets ORM Django. Si vous voulez encoder un dictionnaire Python Python $ ===) normal, vous devez utilisez simplejson, qui est livré avec Django au cas où vous ne l'avez 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 pouvez également utiliser application/json mais cela vous empêchera de déboguer dans votre navigateur):

import json

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

Qu'en est-il d'une classe JsonResponse qui s'é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')
32
Filippo Vitale

Avec les nouvelles versions 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 pouvez trouver plus de détails dans les documents officiels .

8
Dmitrii Mikhailov

Dans python 2.6 et supérieur il y a un Nice bibliothèque JSON , qui a de nombreuses fonctions parmi lesquelles json.dumps () qui sérialise un objet dans une chaîne.

Vous pouvez donc faire quelque chose comme ceci:

import json
print json.dumps({'howdy' : True })
5
Salvador Dali
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
1
Waqas