94 votes

Comment `jsonifier` une liste dans Flask ?

Actuellement Flask lèverait une erreur lors de la jsonification d'une liste.

Je sais qu'il pourrait y avoir des raisons de sécurité https://github.com/mitsuhiko/flask/issues/170 mais j'aimerais quand même pouvoir retourner une liste JSON comme celle qui suit :

[
    {'a': 1, 'b': 2},
    {'a': 5, 'b': 10}
]

au lieu de

{ 'results': [
    {'a': 1, 'b': 2},
    {'a': 5, 'b': 10}
]}

sur la réponse à un application/json demande. Comment puis-je retourner une liste JSON dans Flask en utilisant Jsonify ?

0 votes

Ce n'est plus un problème de sécurité, mais il est toujours considéré comme une bonne pratique de toujours retourner un dict : softwareengineering.stackexchange.com/a/304638/369319

83voto

mianos Points 370

Tu ne peux pas mais tu peux quand même le faire comme ça. J'en avais besoin pour jQuery-File-Upload.

import json
# get this object
from flask import Response

#example data:

    js = [ { "name" : filename, "size" : st.st_size , 
        "url" : url_for('show', filename=filename)} ]
#then do this
    return Response(json.dumps(js),  mimetype='application/json')

1 votes

Il y a aussi flask.json.dumps, mais je ne sais pas si c'est mieux que json.dumps.

3 votes

@CameronWhite - flask.json est un raccourci pour try: import simplejson as json; except ImportError: import json

5 votes

+1 pour mimetype='application/json', cela m'a évité de chercher l'en-tête correspondant :)

61voto

FogleBird Points 23405

jsonify vous empêche de faire cela dans Flask 0.10 et inférieur pour des raisons de sécurité .

Pour le faire quand même, il suffit d'utiliser json.dumps dans la bibliothèque standard de Python.

http://docs.python.org/library/json.html#json.dumps

3 votes

Si je fais cela, je devrai également définir manuellement le Content-Type de l'en-tête ?

3 votes

Oui, application/json .

23 votes

@FogleBird quelle raison de sécurité ?

18voto

Geordee Naliyath Points 853

Cela fonctionne pour moi. Quelle version de Flask utilisez-vous ?

from flask import jsonify

...

@app.route('/test/json')
def test_json():
    list = [
            {'a': 1, 'b': 2},
            {'a': 5, 'b': 10}
           ]
    return jsonify(results = list)

4 votes

J'utilise Flask 0.9 mais il semble que cela produise un hash json plutôt qu'une liste json.

3 votes

Recommander de ne pas utiliser list comme identifiant d'une variable

7voto

stonefury Points 71

Résolu, sans souci. Vous pouvez être paresseux et utiliser jsonify, tout ce que vous devez faire est de passer dans items=[votre liste].

Jetez un coup d'œil ici pour la solution

https://github.com/mitsuhiko/flask/issues/510

0voto

Madhan Points 555

Josonify fonctionne mais si vous souhaitez simplement passer un tableau sans la clé 'results', vous pouvez utiliser la bibliothèque json de python. La conversion suivante fonctionne pour moi

 import json

 @app.route('/test/json')
 def test_json():
 list = [
        {'a': 1, 'b': 2},
        {'a': 5, 'b': 10}
       ]
 return json.dumps(list))

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