json.dumps vs flask.jsonify


277

No estoy seguro de entender el propósito del flask.jsonifymétodo. Intento hacer una cadena JSON a partir de esto:

data = {"id": str(album.id), "title": album.title}

pero lo que obtengo json.dumpsdifiere de lo que obtengo flask.jsonify.

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}]
flask.jsonify(data): {"id":…, "title":…}

Obviamente necesito obtener un resultado que se parezca más a lo que json.dumpsdevuelve. ¿Qué estoy haciendo mal?

Respuestas:


370

La jsonify()función en el matraz devuelve un flask.Response()objeto que ya tiene el encabezado de tipo de contenido apropiado 'aplicación / json' para usar con respuestas json. Mientras que, el json.dumps()método solo devolverá una cadena codificada, lo que requeriría agregar manualmente el encabezado de tipo MIME.

Vea más sobre la jsonify()función aquí para una referencia completa.

Editar: Además, he notado que jsonify()maneja kwargs o diccionarios, mientras que json.dumps()además admite listas y otros.


31
jsonify()maneja listas ahora. Ver este compromiso .
Jeff Widman el

3
Pero todavía no convierte los objetos y listas SQLAlchemy en JSON.
ajbraus

91

Tu puedes hacer:

flask.jsonify(**data)

o

flask.jsonify(id=str(album.id), title=album.title)

82

Esto es flask.jsonify()

def jsonify(*args, **kwargs):
    if __debug__:
        _assert_have_json()
    return current_app.response_class(json.dumps(dict(*args, **kwargs),
        indent=None if request.is_xhr else 2), mimetype='application/json')

El jsonmódulo utilizado es simplejsono jsonen ese orden. current_appes una referencia al Flask()objeto, es decir, su aplicación. response_class()es una referencia a la Response()clase


42

La elección de uno u otro depende de lo que pretendes hacer. Por lo que entiendo:

  • jsonify sería útil cuando está creando una API que alguien consultaría y esperaría a json a cambio. Por ejemplo: la API de github REST podría usar este método para responder a su solicitud.

  • dumps , es más acerca de formatear datos / objetos python en json y trabajar en ellos dentro de su aplicación. Por ejemplo, necesito pasar un objeto a mi capa de representación donde algunos JavaScript mostrarán el gráfico. Alimentará javascript con el Json generado por los volcados.


44
No entiendo la diferencia en absoluto.
vidstige

11
@vidstige: jsonify crea un objeto frasco.Response () con sus encabezados establecidos como "tipo de contenido: aplicación / json", su carga útil establecida como el dict de cadena convertida a JSON. dumps simplemente hace una cadena convertida a JSON. No es un matraz con el formato correcto. Objeto Response (). Entonces, si su vista dice "return json.dumps (dict)", entonces el destinatario obtendrá una respuesta regular de "tipo de contenido: texto / html" con la salida de json.dumps como carga útil.
SamEsla

3
@SamEsla sí, lo sé, pero ninguna de esa información está en esta respuesta.
vidstige

0

considerar

data={'fld':'hello'}

ahora

jsonify(data)

producirá {'fld': 'hola'} y

json.dumps(data)

da

"<html><body><p>{'fld':'hello'}</p></body></html>"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.