Сериализировать хеш как строку, похожую на json с одинарными кавычками в Ruby - PullRequest
0 голосов
/ 03 сентября 2018

Есть ли способ конвертировать хеш, возможно вложенный:

{:event=>"subscribe", :channel=>"data_channel", :parameters=>{:api_key=>"XXX", :sign=>"YYY"}}

в строку в указанном формате, как показано ниже?

"{'event':'subscribe', 'channel':'data_channel', 'parameters': {'api_key':'XXX', 'sign':'YYY'}}"

EDIT

Формат напоминает JSON, но практически не связан с одинарными кавычками.

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Чтобы иметь одинарные кавычки, вы можете попробовать что-то вроде:

JSON.dump(hash).gsub('"', '\'')

Возвращает:

{'event':'subscribe','channel':'data_channel','parameters':{'api_key':'XXX','sign':'YYY'}}
0 голосов
/ 03 сентября 2018

Создайте JSON, затем исправьте:

require 'json'

hash = {:event=>"subscribe", :channel=>"data_channel",
        :parameters=>{:api_key=>"XXX", :sign=>%q{Miles "Chief" O'Brien}}}

puts hash.to_json.gsub(/"((?:\\[\"]|[^\"])*)"/) { |x|
  %Q{'#{$1.gsub(/'|\\"/, ?' => %q{\'}, %q{\\"} => ?")}'}
}
# => {'event':'subscribe','channel':'data_channel',
#    'parameters':{'api_key':'XXX','sign':'Miles "Chief" O\'Brien'}}

РЕДАКТИРОВАТЬ: Первое регулярное выражение говорит: соответствует двойной кавычки, затем последовательность либо двойных кавычек / обратной косой черты, либо не двойные кавычки / символы обратной косой черты, затем снова двойная кавычка. Это гарантирует, что мы найдем только строки, а не случайные полустроки, такие как "Miles \". Для каждой такой строки мы помещаем бит, который был внутри двойных кавычек ($1), в одинарные кавычки, и запускаем на нем подстановку, которая найдет экранированные двойные кавычки и неэкранированные одинарные кавычки, удаляет первый и экранирует последние .

Кроме того, извините за неудачную подсветку, кажется, что подсветка синтаксиса StackOverflow не может справиться с альтернативными формами цитирования Ruby, но они настолько удобны, когда вы работаете с символами кавычек ...

0 голосов
/ 03 сентября 2018

Ваш желаемый результат выглядит как JSON. Попробуйте

require 'json'

JSON.dump(hash)
=> "{\"event\":\"subscribe\",\"channel\":\"data_channel\",\"parameters\":{\"api_key\":\"XXX\",\"sign\":\"YYY\"}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...