Как декодировать json c кириллицей внутри

Рейтинг: 2Ответов: 1Опубликовано: 18.03.2015

Как декодировать json файл с кириллицей внутри с помощью flask/python. Данные с файла:

{"data": [{"\u041e\u0431\u043b\u0430\u0441\u0442\u044c": "\u0418\u0432\u0430\u043d\u043e-     \u0424\u0440\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0430\u044f",     "\u0413\u043e\u0440\u043e\u0434": "\u041a\u043e\u043b\u044c\u0441\u043a\u0438\u0439 \u0440-    \u043d", "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435": "288.00"}, 
....]

  "structure": ["\u041e\u0431\u043b\u0430\u0441\u0442\u044c",     "\u0413\u043e\u0440\u043e\u0434", "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435"]}

Пробовал вот так:

import json

list = [...]
data = json.dumps(list)
print 'Json: %s' % data

# Convert json to python object

new_obj = json.loads(data.decode('utf-8'))
print 'Python obj: %s' % new_obj

Ответы

▲ 2

Если data это json-текст (результат json.dumps()), то никаких преобразований делать не нужно:

obj = json.loads(data)

json поддерживает все возможные Юникодные символы, включая русские буквы.

И не нужно на print ориентироваться -- это только запутает: чтобы правильно понять, что происходит, необходимо чётко представлять разницу между str(obj) и repr(obj), а также понимать разницу между строковыми константами в Питоне и json-строками -- они могут выглядеть похоже, но это разные вещи.

>>> import json
>>> json.dumps(u"\N{EURO SIGN}")
'"\\u20ac"'
>>> s = u"\N{EURO SIGN}" # Строковая константа в Питоне
>>> print s
€
>>> print repr(s) # repr() это как строка в исходном коде может выглядеть
u'\u20ac'
>>> s # по умолчанию REPL использует repr()
u'\u20ac'
>>> repr(s) # представление представления repr(repr(s))
"u'\\u20ac'"
>>> s == u'\u20ac'
True
>>> data = json.dumps(s)
>>> data # json-текст 
'"\\u20ac"' # <- слэш в строковом объекте
>>> json.dumps(s, ensure_ascii=False)
u'"\u20ac"' # *нет* слэша в строковом объекте
>>> print json.dumps(s, ensure_ascii=False)
"€"         # отсутствие слэша более очевидно
>>> json.loads(data)
u'\u20ac'
>>> print json.loads(data)
€