325 votes

json.dumps vs flask.jsonify

Je ne suis pas sûr de comprendre l'objectif de la flask.jsonify méthode. J'essaie d'en faire une chaîne JSON :

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

mais ce que j'obtiens avec json.dumps diffère de ce que j'obtiens avec flask.jsonify .

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

Il est évident que j'ai besoin d'obtenir un résultat qui ressemble plus à ce qui suit json.dumps retours. Qu'est-ce que je fais de mal ?

422voto

Kenneth Wilke Points 659

El jsonify() dans flask renvoie un flask.Response() qui possède déjà l'en-tête content-type "application/json" approprié pour être utilisé avec les réponses json. Alors que l'objet json.dumps() retournera simplement une chaîne encodée, ce qui nécessiterait d'ajouter manuellement l'en-tête MIME type.

En savoir plus sur le jsonify() fonction aquí pour une référence complète.

Modifier : Aussi, j'ai remarqué que jsonify() gère les kwargs ou les dictionnaires, tandis que json.dumps() supporte en outre les listes et autres.

37 votes

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

3 votes

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

0 votes

J'ai utilisé jsonify pour envoyer du json au client. Alors que pour les petits dictionnaires, la réponse fonctionne bien, pour les grands tableaux, j'obtiens une erreur de longueur de contenu inadéquate sur le navigateur. Avez-vous une idée de la raison pour laquelle cela se produit ? Y a-t-il une limite à la quantité de données que je peux envoyer ?

98voto

mikerobi Points 10461

Vous pouvez le faire :

flask.jsonify(**data)

o

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

86voto

mike Points 3565

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

El json Le module utilisé est soit simplejson o json dans cet ordre. current_app est une référence à la Flask() c'est-à-dire votre application. response_class() est une référence à la Response() classe.

48voto

chaiyachaiya Points 249

Le choix de l'un ou l'autre dépend de ce que vous avez l'intention de 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 REST github pourrait utiliser cette méthode pour répondre à votre demande.

  • dumps Il s'agit plutôt de formater des données/objets Python en Json et de les utiliser dans votre application. Par exemple, j'ai besoin de passer un objet à ma couche de représentation où un javascript va afficher le graphique. Vous alimenterez le javascript avec le Json généré par les dumps.

4 votes

Je ne comprends pas du tout la différence.

12 votes

@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 le dict converti en chaîne JSON. dumps fait simplement une chaîne convertie en JSON. Ce n'est pas un objet flask.Response() correctement formaté. Ainsi, si votre vue dit "return json.dumps(dict)", le destinataire recevra simplement une réponse ordinaire "content-type:text/html" avec la sortie json.dumps comme données utiles.

6 votes

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

-1voto

Govind Kelkar Points 7

Envisager

data={'fld':'hello'}

maintenant

jsonify(data)

donnera {fld' : 'hello'} et

json.dumps(data)

donne

"<html><body><p>{'fld':'hello'}</p></body></html>"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X