web-dev-qa-db-fra.com

dictionnaire python jsonify dans utf-8

Je veux obtenir des données JSON en utf-8 

J'ai une liste my_list = []

puis beaucoup ajoute des valeurs Unicode à la liste comme celle-ci 

my_list.append(u'ტესტ')

return jsonify(result=my_list)

et ça devient 

{
"result": [
"\u10e2\u10d4\u10e1\u10e2",
"\u10e2\u10dd\u10db\u10d0\u10e8\u10d5\u10d8\u10da\u10d8"
]
}
18
beka

Utilisez plutôt le module json de la bibliothèque standard et définissez le paramètre de mot clé ensure_ascii sur False lors du codage, ou effectuez la même chose avec flask.json.dumps() :

>>> data = u'\u10e2\u10d4\u10e1\u10e2'
>>> import json
>>> json.dumps(data)
'"\\u10e2\\u10d4\\u10e1\\u10e2"'
>>> json.dumps(data, ensure_ascii=False)
u'"\u10e2\u10d4\u10e1\u10e2"'
>>> print json.dumps(data, ensure_ascii=False)
"ტესტ"
>>> json.dumps(data, ensure_ascii=False).encode('utf8')
'"\xe1\x83\xa2\xe1\x83\x94\xe1\x83\xa1\xe1\x83\xa2"'

Notez que vous devez toujours explicitement coder le résultat en UTF8 car la fonction dumps() renvoie un objet unicode dans ce cas.

Vous pouvez en faire la valeur par défaut (et utiliser à nouveau jsonify()) en définissant JSON_AS_ASCII sur False dans la configuration de votre application Flask.

WARNING: n'incluez pas dans JSON des données non fiables qui ne sont pas sécurisées par ASCII, puis interpolez-les dans un modèle HTML ou utilisez-les dans une API JSONP, car vous pouvez provoquer des erreurs de syntaxe ou ouvrir un site croisé. script de vulnérabilité de cette façon. C’est parce que JSON n’est pas un sous-ensemble strict de Javascript , et lors de la désactivation de l’encodage ASCII sécurisé, les séparateurs U + 2028 et U + 2029 ne seront pas protégés par les séquences \u2028 et \u2029.

15
Martijn Pieters

Utilisez la configuration suivante pour ajouter le support UTF-8:

app.config['JSON_AS_ASCII'] = False
29
Osvaldo Colina

Si vous voulez toujours utiliser le json de flask et vous assurer du codage utf-8, vous pouvez faire quelque chose comme ça:

from flask import json,Response
@app.route("/")
def hello():
    my_list = []
    my_list.append(u'ტესტ')
    data = { "result" : my_list}
    json_string = json.dumps(data,ensure_ascii = False)
    #creating a Response object to set the content type and the encoding
    response = Response(json_response,content_type="application/json; charset=utf-8" )
    return response

J'espère que ça aide

2
robus gauli

Dans mon cas, la solution ci-dessus n'était pas suffisante. (Exécution du flacon dans l’environnement flexible de GCP App Engine). J'ai fini par faire:

json_str = json.dumps(myDict, ensure_ascii = False, indent=4, sort_keys=True)
encoding = chardet.detect(json_str)['encoding']
json_unicode = json_str.decode(encoding)
json_utf8 = json_unicode.encode('utf-8')
response = make_response(json_utf8)
response.headers['Content-Type'] = 'application/json; charset=utf-8'
response.headers['mimetype'] = 'application/json'
response.status_code = status
0
Ture Friese