2009-04-28 27 views
35

Estoy tratando de hacer una función Django para serializar JSON algo y devolverlo en un objeto HttpResponse.¿Cómo serializo JSON un diccionario de Python?

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

lo estoy usando como esto:

return json_response({ howdy : True }) 

pero me sale este error:

"bool" object has no attribute "_meta" 

¿Alguna idea?

EDIT: Aquí está el rastreo:

http://dpaste.com/38786/

+0

Sin la trazabilidad real, no. –

Respuesta

61

Actualización: Python ahora tiene su propio controlador de JSON, basta con utilizar import json en lugar de utilizar simplejson.


El módulo de serializadores Django está diseñado para serializar objetos Django ORM. Si desea codificar un diccionario de Python normal, debe usar simplejson, que se envía con Django en caso de que no lo tenga instalado ya.

import json 

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

me gustaría sugerir enviarla de vuelta con un/javascript cabecera Content-Type aplicación (también se podría utilizar application/json sino que evitará que la depuración en su navegador):

import json 

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

Use JSONView en Firefox para formatear correctamente JSON devuelto con el tipo de contenido application/json. – Dave

+2

Se suponía que era un enlace a https://addons.mozilla.org/en-US/firefox/addon/10869 – Dave

+0

ese complemento también está disponible en cromo – miki725

30

¿Qué pasa con un JsonResponseClase que se extiende 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

Es una buena idea, probablemente use esto –

+0

Nunca he visto esto antes. Definitivamente es una buena/manera reutilizable. – KVISH

4

En python 2.6 y superior hay un buen JSON library, que tiene muchas funciones entre las cuales está json.dumps() que serializa un objeto en una cadena.

para que pueda hacer algo como esto:

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 las nuevas versiones de Django sólo puede utilizar JsonResponse proporcionada por django.http:

from django.http import JsonResponse 

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

Puede encontrar más detalles en el official docs.

Cuestiones relacionadas