python jsonify dictionnaire en utf-8
je veux obtenir des données json en utf-8
j'ai une liste de my_list = []
et puis beaucoup de ajoute valeurs unicode à la liste comme ceci
my_list.append(u'ტესტ')
return jsonify(result=my_list)
et il devient
{
"result": [
"u10e2u10d4u10e1u10e2",
"u10e2u10ddu10dbu10d0u10e8u10d5u10d8u10dau10d8"
]
}
4 réponses
utilisez la bibliothèque standard json
module au lieu de cela, et réglez l'option ensure_ascii
paramètre de mot-clé à False lors de l'encodage, ou faites 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 encoder explicitement le résultat à UTF8 parce que le dumps()
la fonction renvoie un unicode
objet dans ce cas.
vous pouvez le faire par défaut (et utiliser jsonify()
encore une fois) par JSON_AS_ASCII
False dans votre application de flasque config.
avertissement: n'incluez pas de données non fiables dans JSON qui ne sont pas ASCII-safe, puis interpolez dans un modèle HTML ou utilisez dans une API JSONP, car vous pouvez causer des erreurs de syntaxe ou ouvrir une vulnérabilité de script intersite 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-safe, Les séparateurs U+2028 et U+2029 ne seront pas échappés à \u2028
et \u2029
séquences.
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 assurer l'encodage utf-8 alors vous pouvez faire quelque chose comme ceci:
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 cela aide
Dans mon cas, la solution ci-dessus n'était pas suffisant. (Flasque tournant sur l'environnement flexible du moteur GCP App). 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