2009-04-28 22 views
35

Próbuję utworzyć funkcję Django dla JSON serializując coś i zwracając go w obiekcie HttpResponse.W jaki sposób JSON serializuje słownik Python?

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

używam go tak:

return json_response({ howdy : True }) 

Ale otrzymuję ten błąd:

"bool" object has no attribute "_meta" 

jakieś pomysły?

EDIT: Oto traceback:

http://dpaste.com/38786/

+0

Bez aktualnego śledzenia, nie. –

Odpowiedz

61

Aktualizacja: Python ma teraz swój własny obsługi json, wystarczy użyć import json zamiast korzystania simplejson.


Moduł serializatorów Django przeznaczony jest do serializowania obiektów ORM Django. Jeśli chcesz zakodować zwykły słownik Pythona, powinieneś użyć simplejson, który jest dostarczany z Django na wypadek, gdybyś już go nie zainstalował.

import json 

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

Sugeruję wysłanie go z powrotem z/javascript nagłówka Content-Type aplikacji (można też użyć aplikacji/json ale uniemożliwi debugowania w przeglądarce):

import json 

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

Używaj JSONView w Firefox, aby ładnie sformatować JSON zwrócony z typem zawartości aplikacji/json. – Dave

+2

To miał być link do https://addons.mozilla.org/en-US/firefox/addon/10869 – Dave

+0

, którego wtyczka jest również dostępna w chrome – miki725

30

Co o JsonResponseklasy który rozciąga 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

To dobry pomysł, prawdopodobnie użyję tego –

+0

Nigdy wcześniej tego nie widziałem. Zdecydowanie jest to dobry/wielokrotnego użytku sposób. – KVISH

4

W pythonie 2.6 i wyżej jest ładny JSON library, który ma wiele funkcji, między innymi json.dumps(), który serializuje obiekt do łańcucha znaków.

Więc można zrobić coś takiego:

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

z nowszymi wersjami Django można po prostu użyć JsonResponse dostarczone przez django.http:

from django.http import JsonResponse 

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

można znaleźć więcej szczegółów w official docs.

Powiązane problemy