2009-04-28 15 views
35

Sto provando a creare una funzione Django per la serializzazione JSON di qualcosa e la sua restituzione in un oggetto HttpResponse.Come si serializza un dizionario Python in JSON?

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

sto usando in questo modo:

return json_response({ howdy : True }) 

ma ottengo questo errore:

"bool" object has no attribute "_meta" 

Tutte le idee?

EDIT: Ecco il traceback:

http://dpaste.com/38786/

+0

Senza il traceback effettivo, no. –

risposta

61

Aggiornamento: Python ha ora il proprio gestore JSON, è sufficiente utilizzare import json invece di utilizzare simplejson.


Il modulo serializzatori Django è progettato per serializzare oggetti ORG Django. Se vuoi codificare un normale dizionario Python devi usare simplejson, che viene fornito con Django nel caso in cui non lo avessi già installato.

import json 

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

io suggerirei l'invio di nuovo con una/javascript header Content-Type applicazione (si potrebbe anche usare l'applicazione/JSON, ma che ti impedirà di debug nel tuo browser):

import json 

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

Utilizzare JSONView in Firefox per formattare correttamente JSON restituito con il tipo di contenuto dell'applicazione/json. – Dave

+2

Questo doveva essere un collegamento a https://addons.mozilla.org/en-US/firefox/addon/10869 – Dave

+0

che il plug-in è disponibile anche in chrome – miki725

30

che dire di una JsonResponseClasse che si estende 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') 
+2

Questa è una buona idea probabilmente userò questo –

+0

Mai visto prima. Sicuramente è un modo buono/riutilizzabile. – KVISH

4

In Python 2.6 e versioni successive c'è un bel JSON library, che ha molte funzioni tra cui json.dumps() che serializza un oggetto in una stringa.

modo da poter fare qualcosa di simile:

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

Con le versioni più recenti di Django si può semplicemente utilizzare JsonResponse fornito da django.http:

from django.http import JsonResponse 

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

È possibile trovare maggiori dettagli nello official docs.

Problemi correlati