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"
]
}
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
.
Utilisez la configuration suivante pour ajouter le support UTF-8:
app.config['JSON_AS_ASCII'] = False
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
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