json.dumps vs flask.jsonify


277

Je ne suis pas sûr de comprendre le but de la flask.jsonifyméthode. J'essaie de créer une chaîne JSON à partir de ceci:

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

mais ce que je reçois json.dumpsdiffère de ce que je reçois flask.jsonify.

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

Évidemment, je dois obtenir un résultat qui ressemble davantage à ce qui json.dumpsrevient. Qu'est-ce que je fais mal?

Réponses:


370

La jsonify()fonction dans flask renvoie un flask.Response()objet qui a déjà l'en-tête de type de contenu approprié 'application / json' à utiliser avec les réponses json. Considérant que, la json.dumps()méthode renverra simplement une chaîne codée, ce qui nécessiterait l'ajout manuel de l'en-tête de type MIME.

En savoir plus sur la jsonify()fonction ici pour référence complète.

Edit: En outre, j'ai remarqué qu'il jsonify()gère les kwargs ou les dictionnaires, tout en json.dumps()prenant en charge les listes et autres.


31
jsonify()gère maintenant les listes. Voir cet engagement .
Jeff Widman

3
Mais il ne transforme toujours pas les objets et les listes SQLAlchemy en JSON.
ajbraus

91

Tu peux faire:

flask.jsonify(**data)

ou

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

82

C'est 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')

Le jsonmodule utilisé est soit simplejsonou jsondans cet ordre. current_appest une référence à l' Flask()objet c'est-à-dire à votre application. response_class()est une référence à la Response()classe.


42

Le choix de l'un ou l'autre dépend de ce que vous comptez faire. D'après ce que je comprends:

  • jsonify serait utile lorsque vous construisez une API que quelqu'un interrogerait et attendrait json en retour. Par exemple: l'API github REST pourrait utiliser cette méthode pour répondre à votre demande.

  • dumps , consiste davantage à formater un objet data / python dans json et à travailler dessus dans votre application. Par exemple, je dois passer un objet à ma couche de représentation où certains javascript afficheront le graphique. Vous alimenterez javascript avec le Json généré par les vidages.


4
Je ne comprends pas du tout la différence.
vidstige

11
@vidstige: jsonify crée un objet flask.Response () avec ses en-têtes définis comme "content-type: application / json", sa charge utile définie comme dict converti en chaîne JSON. dumps crée simplement une chaîne convertie en JSON. Ce n'est pas un objet flask.Response () correctement formaté. Donc, si votre vue indique "return json.dumps (dict)", le destinataire recevra simplement une réponse "content-type: text / html" régulière avec la sortie json.dumps comme charge utile.
SamEsla

3
@SamEsla oui, je sais, mais aucune de ces informations ne figure dans cette réponse.
vidstige

0

considérer

data={'fld':'hello'}

maintenant

jsonify(data)

donnera {'fld': 'bonjour'} et

json.dumps(data)

donne

"<html><body><p>{'fld':'hello'}</p></body></html>"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.