Запрет JSON pretty_generate от выхода из Юникода - PullRequest
5 голосов
/ 28 июня 2011

Можно ли как-нибудь помешать методу JSON.pretty_generate() в Ruby экранировать символ Unicode?

У меня есть объект JSON следующим образом:

my_hash = {"my_str" : "\u0423"};

Running JSON.pretty_generate(my_hash) возвращает значениекак \\u0423.

Есть ли способ предотвратить такое поведение?

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

В вашем вопросе у вас есть строка из 6 символов Юникода "\", "u", "0", "4", "2", "3" (my_hash = { "my_str" => '\u0423' }), а не строка, состоящая из 1 "У" символ ("\u0423", обратите внимание на двойные кавычки).

Согласно RFC 4627 , пункт 2.5 , символ обратной косой черты в строке JSON должен быть экранирован, этопочему вы получаете двойную обратную косую черту из JSON.pretty_generate.

В качестве альтернативы, есть двухсимвольная последовательность экранирующих
представлений некоторых популярных символов.Так, например, строка
, содержащая только один обратный солидус, может быть
представлена ​​более компактно как "\\".

char = unescaped /
       escape (...
           %x5C /          ; \    reverse solidus U+005C

escape = %x5C              ; \

Таким образом JSON ruby ​​gem экранирует этот символ внутри, и нет способа изменить это поведение путем параметризации JSON или JSON.pretty_generate.

Если вас интересует Подробности реализации JSON - он определяетхэш внутреннего сопоставления с явным отображением '\' char:

module JSON
    MAP = {
        ...
        '\\'  =>  '\\\\'

Я взял этот код из чисто рубинового варианта из JSON gem gem install json_pure (обратите внимание, что есть также Вариант расширения C , который распределяется по gem install json).

Вывод: Если вам нужно удалить обратную косую черту после генерации JSON, вам нужно внедрить ее в логику приложения, напримерв приведенном выше коде:

my_hash = { "my_str" => '\u0423' }
# => {"my_str"=>"\\u0423"}

json = JSON.pretty_generate(my_hash)
# => "{\n  \"my_str\": \"\\\\u0423\"\n}"

res = json.gsub "\\\\", "\\"
# => "{\n  \"my_str\": \"\\u0423\"\n}"

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

2 голосов
/ 21 декабря 2011

Обычно хэши объявляются с использованием ракеты => вместо двоеточия :.Кроме того, существует альтернативный синтаксис для хэшей с символьными ключами, начиная с 1.9: my_hash = {my_str: "\u0423"}.В этом случае ключом будет :my_str.

В любом случае, на моем компьютере JSON.pretty_generate работает должным образом:

irb(main):002:0> my_hash = {"my_str" => "\u0423"}
=> {"my_str"=>"У"}
irb(main):003:0> puts JSON.pretty_generate(my_hash)
{
  "my_str": "У"
}
=> nil

Ruby 1.9.2p290, (встроенный) json1.4.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...