Словарь python jsonify в utf-8

Я хочу получить json-данные в utf-8

У меня есть список my_list = []

а затем многие добавляет значения unicode в список, подобный этому

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

return jsonify(result=my_list)

и он получает

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

Ответ 1

Вместо этого используйте стандартную библиотеку json module и установите для параметра ключевого слова ensure_ascii значение False при кодировании или выполните то же самое с 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"'

Обратите внимание, что вам все равно нужно явно кодировать результат в UTF8, потому что функция dumps() возвращает объект unicode в этом случае.

Вы можете сделать это по умолчанию (и снова использовать jsonify()) с помощью установить JSON_AS_ASCII в False в конфигурацию приложения Flask.

ПРЕДУПРЕЖДЕНИЕ: не включайте ненадежные данные в JSON, которые не являются ASCII-безопасными, а затем интерполируются в HTML-шаблон или используются в JSONP API, так как вы можете вызывать синтаксические ошибки или открывать крест таким образом, уязвимость сценариев. Это потому, что JSON не является строгим подмножеством Javascript, а при отключении ASCII-безопасной кодировки разделители U + 2028 и U + 2029 не будут экранировано до \u2028 и \u2029 последовательностей.

Ответ 2

Используйте следующую конфигурацию, чтобы добавить поддержку UTF-8:

app.config['JSON_AS_ASCII'] = False

Ответ 3

Если вы все еще хотите, чтобы пользователь flask json и обеспечил кодировку utf-8, вы можете сделать что-то вроде этого:

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

Надеюсь, это поможет

Ответ 4

В моем случае вышеуказанное решение было недостаточным. (Запуск фляжки в гибкой среде приложения GCP App Engine). Я закончил:

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