Пожалуйста, рассмотрите это решение. Библиотека + спецификация:
Файл lib/ext/hash/from_string.rb
::
require "json"
module Ext
module Hash
module ClassMethods
def from_string(s)
s.gsub!(/(?<!\\)"=>nil/, '":null')
s.gsub!(/(?<!\\)"=>/, '":')
JSON.parse(s)
end
end
end
end
class Hash
extend Ext::Hash::ClassMethods
end
Файл spec/lib/ext/hash/from_string_spec.rb
::
require "ext/hash/from_string"
describe "Hash.from_string" do
it "generally works" do
[
['{"x"=>"y"}', {"x" => "y"}],
['{"is"=>true}', {"is" => true}],
['{"is"=>false}', {"is" => false}],
['{"is"=>nil}', {"is" => nil}],
['{"a"=>{"b"=>"c","ar":[1,2]}}', {"a" => {"b" => "c", "ar" => [1, 2]}}],
['{"id"=>34030, "users"=>[14105]}', {"id" => 34030, "users" => [14105]}],
['{"data"=>"{\"x\"=>\"y\"}"}', {"data" => "{\"x\"=>\"y\"}"}],
].each do |input, expected|
output = Hash.from_string(input)
expect([input, output]).to eq [input, expected]
end
end
end