将json转换为ruby哈希

时间:2011-11-01 08:57:14

标签: ruby json hashmap

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

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

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

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

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

6 个答案:

答案 0 :(得分:234)

以下代码段如何?

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

答案 1 :(得分:22)

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

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

然后

json[:val] #=> "test"

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

答案 2 :(得分:3)

假设你有一个JSON哈希挂在某处,为了自动将它转换为类似WarHog的版本,将你的json哈希内容包装在%q {hsh}标签中。这似乎会自动添加所有必要的转义文本,如WarHog的回答

答案 3 :(得分:3)

令我惊讶的是,没有人指出JSON的[]方法,它使从JSON解码和编码变得非常容易和透明。

如果object是类似于字符串的,则解析字符串并将解析后的结果作为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

答案 4 :(得分:2)

您是否尝试过:http://flori.github.com/json/

如果做不到,你可以解析一下吗?如果它只是你感兴趣的数组,那么将上述内容拆分的内容将非常简单。 Ñ

答案 5 :(得分: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]