Создайте 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, но они настолько удобны, когда вы работаете с символами кавычек ...