web-dev-qa-db-fra.com

json.dumps vs flask.jsonify

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

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

mais ce que je reçois avec json.dumps diffère de ce que je reçois avec flask.jsonify.

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

Il est évident que je dois obtenir un résultat qui ressemble davantage à ce que json.dumps renvoie. Qu'est-ce que je fais mal?

233
Sergei Basharov

La fonction jsonify() dans flask renvoie un objet flask.Response() qui possède déjà l'en-tête de type de contenu approprié 'application/json' à utiliser avec les réponses json. Tandis que la méthode json.dumps() 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 fonction jsonify()ici pour une référence complète.

Edit: De plus, j'ai remarqué que jsonify() gère les kwargs ou les dictionnaires, tandis que json.dumps() prend également en charge les listes et autres.

316
Kenneth Wilke

Tu peux faire:

flask.jsonify(**data)

ou

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

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 module json utilisé est soit simplejson, soit json dans cet ordre. current_app est une référence à l'objet Flask(), c'est-à-dire votre application. response_class() est une référence à la classe Response().

73
Michael Ekoka

Le choix de l'un ou de l'autre dépend de ce que vous avez l'intention de faire. D'après ce que j'ai compris:

  • jsonify serait utile lorsque vous construisez une API que quelqu'un interroge et attend JSON en retour. E.g: l’API REST github peut utiliser cette méthode pour répondre à votre demande.

  • dumps, est plus sur la formulation d'objet data/python en json et le travail à l'intérieur de votre application. Par exemple, je dois passer un objet à ma couche de représentation où du javascript affichera un graphique. Vous alimenterez javascript avec le Json généré par les sauvegardes.

30
chaiyachaiya