Преобразование Ruby Hash в JSON (без escape-символов)

У меня есть хэш:

my_hash = {"[email protected]"=>{"first"=>"Bob", "last"=>"Johnson"}, "[email protected]"=>{"first"=>"Lisa", "last"=>"Dell"}}

Когда я пытаюсь сериализовать его с помощью my_hash.to_json, это то, что я получаю:

"{\"[email protected]\":{\"first\":\"Bob\",\"last\":\"Johnson\"},\"[email protected]\":{\"first\":\"Lisa\",\"last\":\"Dell\"}}"

Как я могу преобразовать формат Hash в JSON без получения экранирующих символов?

Ответ 1

Эти escape-символы выходят " в Ruby String (ваш my_hash.to_json вывод). Если вы делаете

puts my_hash.to_json

вы увидите, что на самом деле эти escape-символы не добавляются в строку вывода.

Ответ 2

to_json создает строку в двойных кавычках, а затем заполняет JSON двойными кавычками. Вот почему экранирующие символы представлены в первую очередь. Если вы должны были заменить внутренние двойные кавычки одинарными кавычками, необходимость в escape-символе теперь не нужна. Поэтому использование gsub с регулярным выражением для escape-символов является возможным решением:

my_hash.to_json.gsub(/[\"]/, "'") 

=> "{'[email protected]':{'first':'Bob','last':'Johnson'},'[email protected]':{'first':'Lisa','last':'Dell'}}"

/[\"]/ = регулярное выражение, которое соответствует escape-символу и двойной кавычке, которую он экранирует как пара. Метод gsub заменяет оба символа во всех совпадающих экземплярах символом одинарной кавычки, предоставляя вам неэкранированную строку JSON.