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?

Sergei Basharov
la source

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.

Kenneth Wilke
la source
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)
mikerobi
la source
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.

Michael Ekoka
la source
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.

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