0

Как сохранять специальные символы (°, $, ¥, степени числа) в JSON?

При парсинге данных (с помощью python, scrapy) попадается много специфических символов, которые не отображаются в человекоподобном виде.

Например, значение температуры - 1021 °C, на выходе получаю

>>> response.xpath('path').extract()
u'1021 \xb0C'
>>> print(response.xpath('path').extract())
1021 °C

И при формировании JSON-объекта получаю

 [{
 ..."temp": "1021 \u00b0C", ...
 }]

А нужно

[{
 ..."temp": "1021 °C", ...
 }]

Как мне добиться человекоподобного вида в JSON? Чтобы символы оторажались как есть.

while1pass
  • 2,265
  • 1
    стандартом json такие символы запрещены, они обязаны быть закодированы. Вы конечно можете сами пройтись по json-тексту и преобразовать \u но потом такой json не факт что проглотят функции которые с ним должны работать – Mike Aug 01 '16 at 21:51
  • то есть оставить как есть в машинном виде? а если я буду импортировать данные в БД? – while1pass Aug 01 '16 at 22:22
  • 2
    Если вы любой стандартной функцией этот json преобразуете в массив и будете его грузить, то в массиве то у вас все уже будет декодировано. А если сам json сохранять в БД то какая разница как он там выглядит – Mike Aug 01 '16 at 22:24
  • знак градуса сохранится в БД как \u00b0C или °C? – while1pass Aug 01 '16 at 22:28
  • 1
    а вы что в БД сохранять то будете ? как json преобразуете в формат БД ? – Mike Aug 01 '16 at 22:30
  • немного не понял вопрос. сохранять буду значения и размерности величин, в конкреттном случае 1021 и знак градуса, json намереваюсь использовать как промежуточный формат для хранения данных между парсингом и импортом из него в БД – while1pass Aug 01 '16 at 22:33
  • 1
    Вы парсить json перед загрузкой в БД чем будете ? какую нибудь библиотечную функцию ведь возьмете ? Так вот любые функции при декодировнии json разумеется превратят \u в сами символы – Mike Aug 01 '16 at 22:37
  • Спасибо за пояснение. Про импорт в БД еще не думал конкретно, работаю над парсингом и появился озвученный вопрос. – while1pass Aug 01 '16 at 22:41
  • 2
    @Mike не вводите человека в заблуждение. json конечно же поддерживает эти символы. json это текстовый формат, который определён в терминах Юникода. Экранированные последовательности такие как \uxxxx позволяют произвольный json текст передавать, используя ASCII кодировку, но конечно же, не обязательно эти последовательности использовать (кроме отдельных исключений). близко к теме. – jfs Aug 02 '16 at 19:58

1 Answers1

3

Если вы используете стандартную библиотеку json и не хотите видеть закодированные символы в результате преобразования, можно использовать дополнительный параметр ensure_ascii функции dumps (имеется также у функции dump):

>>> print(json.dumps('1021 °C', ensure_ascii=False))
"1021 °C"

Насколько я понимаю, JSON разрешает использовать произвольные Unicode символы в строках. Вот, что я нашёл в спецификации:

All Unicode characters may be placed within the quotation marks, except for the characters that must be escaped: quotation mark, reverse solidus, and the control characters (U+0000 through U+001F).

Что после вольного перевода читается как

Внутри кавычек (") могут быть помещены любые юникодные символы, за исключением символов, которые обязательно должны быть экранированы: кавычки ("), обратная косая черта (\) и контрольные символы (с U+0000 до U+001F)

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