如何将 JSON 转换为 Ruby 哈希
Posted
技术标签:
【中文标题】如何将 JSON 转换为 Ruby 哈希【英文标题】:How to convert JSON to a Ruby hash 【发布时间】:2011-12-19 08:10:46 【问题描述】:我有一个 JSON 对象包含以下值:
@value = "val":"test","val1":"test1","val2":"test2"
我想在 Ruby 中遍历它以获取键/值对。当我使用@each
时,它不会遍历对象,因为它不是 Ruby 哈希形式:
@value = "val"=>"test","val1"=>"test1","val2"=>"test2"
如何将上述 JSON 对象转换为 Ruby 哈希?
【问题讨论】:
【参考方案1】:你试过了吗:http://flori.github.com/json/?
如果做不到这一点,你可以把它解析出来吗?如果它只是您感兴趣的数组,那么将上述内容拆分出来将非常简单。
【讨论】:
链接失效,请用最新链接更新答案。【参考方案2】:下面的sn-p呢?
require 'json'
value = '"val":"test","val1":"test1","val2":"test2"'
puts JSON.parse(value) # => "val"=>"test","val1"=>"test1","val2"=>"test2"
【讨论】:
value = '"val":"test","val1":"test1","val2":"test2"'
可能更具可读性。【参考方案3】:
假设你有一个 JSON 散列挂在某个地方,为了自动将它转换成类似 WarHog 的版本,将你的 JSON 散列内容包装在 %qhsh
标签中。
这似乎会自动添加所有必要的转义文本,就像 WarHog 的回答一样。
【讨论】:
【参考方案4】:您也可以使用 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 的新手,但假设这会重复键值对? 天哪,这是在寻找“简单”解决方案 2 小时后的救星。谢谢!!【参考方案5】:您可以使用 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]
【讨论】:
【参考方案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
。
【讨论】:
以上是关于如何将 JSON 转换为 Ruby 哈希的主要内容,如果未能解决你的问题,请参考以下文章
将 json 格式的键值对转换为以符号为键的 ruby 哈希的最佳方法是啥?
如何表示将 ruby 哈希转换为 yaml 的 aws 内部函数