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?

Sergei Basharov
fuente

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.

Kenneth Wilke
fuente
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)
Mikerobi
fuente
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

Michael Ekoka
fuente
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.

chaiyachaiya
fuente
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>"
Govind Kelkar
fuente