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"
]
}
16
demandé sur Martijn Pieters 2013-02-13 16:33:58

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.

12
répondu Martijn Pieters 2018-02-12 12:45:20

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

app.config['JSON_AS_ASCII'] = False
25
répondu Osvaldo Colina 2016-09-18 19:25:37

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

1
répondu robus gauli 2016-10-07 14:38:38

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
0
répondu Ture Friese 2018-01-08 13:41:20