如何将JSON转换为Ruby哈希表

155

我有一个JSON对象,其中包含以下值:

@value = {"val":"test","val1":"test1","val2":"test2"}

我想在Ruby中循环遍历它以获取键/值对。当我使用@each时,它不会迭代对象,因为它不是以Ruby的哈希形式存在的:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

如何将上述JSON对象转换为Ruby哈希表?

5个回答

289
require 'json'
value = '{"key_1":"value_1", "key_2":"value_2"}'
puts JSON.parse(value) # => {"key_1"=>"value_1","key_2"=>"value_2"}

7
value = '{"val":"test","val1":"test1","val2":"test2"}' 可以更易读。 - luckykrrish

56

你还可以使用Rails的 with_indifferent_access 方法,这样你就可以使用符号或字符串访问正文。

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access
json[:val] #=> "test"

json["val"] #=> "test"

有人知道对于更大的哈希对象来说,这是否会占用更多资源吗?我是 Ruby/Rails 的新手,但假设这会复制键值对? - Jon Lawton
1
哦天啊,在寻找“简单”解决方案两个小时后,这真是救命稻草。谢谢! - listenlight
当尝试匹配存根请求时,这可能会导致规范出现问题。 - svelandiag

6
JSON有一个[]方法,使得从JSON解码和编码变得非常简单和透明。
如果对象类似于字符串,解析该字符串并将解析结果作为Ruby数据结构返回。否则,从Ruby数据结构对象生成一个JSON文本并返回。
考虑以下内容:
require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

str现在包含了JSON编码的hash

使用以下方法很容易将其反转:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

自定义对象需要为类定义to_s方法,并在其中将对象转换为哈希,然后使用to_json方法对其进行处理。

5
假设您有一个JSON哈希在某个地方,想要自动将其转换为类似WarHog版本的内容,只需要将JSON哈希内容包装在%q{hsh}标记中。这似乎会自动添加所有必要的转义文本,就像WarHog的答案一样。

0
你可以使用nice_hash gem: https://github.com/MarioRuiz/nice_hash
require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接