如何将 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 哈希的主要内容,如果未能解决你的问题,请参考以下文章

将 Ruby 哈希转换为 JSON(不带转义字符)

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

如何表示将 ruby​​ 哈希转换为 yaml 的 aws 内部函数

如何将 Ruby 哈希转换为 XML?

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

如何将 Ruby 对象转换为 JSON