Похоже, это действительно то, что вы хотите.
То, что вы видите, это строка, отформатированная для отображения (и читаемости человеком).Он ограничен двойными кавычками, поэтому двойные кавычки внутри строки экранируются.В действительности строка содержит двойные кавычки, но для буквального представления они экранированы.Если вы вставите это в анализатор JSON, вы обнаружите, что он возвращает нужный вам объект.
Если вы распечатаете это, вы обнаружите, что получите нужный формат.
irb(main):001:0> puts { "a" => "blah" }.to_json
{"a":"blah"}
=> nil
Для дальнейшей иллюстрации, вы можете попробовать разобрать его.Строка, с которой вы пришли, возвращает ваш исходный объект, потому что JSON представлен строкой.Однако попытка вставить желаемый контент приведет к неприятной синтаксической ошибке или к ошибке TypeError.Это потому, что JSON не является литералом в Ruby, тогда как в JavaScript его можно использовать как литеральный объект.В Ruby это представление в виде строки.
irb(main):002:0> JSON.parse("{\"a\":\"blah\"}")
=> {"a"=>"blah"}
irb(main):003:0> JSON.parse({ "a" : "blah" })
SyntaxError: (irb):3: syntax error, unexpected ':', expecting tASSOC
JSON.parse({ "a" : "blah" })
^
(irb):3: syntax error, unexpected '}', expecting $end
JSON.parse({ "a" : "blah" })
^
irb(main):004:0> JSON.parse({a:"blah"})
TypeError: can't convert Hash into String