В вашем вопросе у вас есть строка из 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}"
Надеюсь, это поможет!