it-swarm.com.de

python jsonify dictionary in utf-8

Ich möchte JSON-Daten in UTF-8 bekommen

Ich habe eine Liste my_list = []

und dann hängen viele Unicode-Werte wie folgt an die Liste an

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

return jsonify(result=my_list)

und es wird

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

Verwenden Sie stattdessen die Standardbibliothek json module , und setzen Sie den Schlüsselwortparameter ensure_ascii beim Codieren auf False, oder machen Sie dasselbe mit 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"'

Beachten Sie, dass Sie das Ergebnis weiterhin explizit in UTF8 codieren müssen, da die Funktion dumps() in diesem Fall ein Objekt unicode zurückgibt.

Sie können dies durch Setzen von JSON_AS_ASCII auf False in Ihrer Flask-App-Konfiguration zur Standardeinstellung machen (und jsonify() erneut verwenden).

WARNING: Nehmen Sie keine nicht vertrauenswürdigen Daten in JSON auf, die nicht ASCII-sicher sind, und interpolieren Sie sie dann in eine HTML-Vorlage oder verwenden Sie sie in einer JSONP-API, da Sie Syntaxfehler verursachen oder eine Cross-Site öffnen können Scripting-Schwachstelle auf diese Weise. Dies liegt daran, dass JSON ist keine strenge Teilmenge von Javascript und beim Deaktivieren der ASCII-sicheren Codierung die Trennzeichen U + 2028 und U + 2029 nicht in \u2028- und \u2029-Sequenzen maskiert werden.

15
Martijn Pieters

Verwenden Sie die folgende Konfiguration, um UTF-8-Unterstützung hinzuzufügen:

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

Wenn Sie weiterhin flask's json verwenden und die utf-8-Codierung sicherstellen möchten, können Sie Folgendes tun:

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

Ich hoffe das hilft

2
robus gauli

In meinem Fall war die obige Lösung nicht ausreichend. (Ausführen von flask in der flexiblen Umgebung von GCP App Engine). Am Ende machte ich:

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