ChatGPT解决这个技术问题 Extra ChatGPT

如何将 JSON 转换为 Ruby 哈希

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

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

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

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

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


S
Sergey Alekseev

下面的代码片段呢?

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"}' 可能更具可读性。
t
the Tin Man

您还可以使用 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 小时后,这是一个救命稻草。谢谢!!
t
the Tin Man

我很惊讶没有人指出 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,并在其中将对象转换为 Hash,然后在其上使用 to_json


t
the Tin Man

假设您有一个 JSON 散列挂在某处,要自动将其转换为类似 WarHog 的版本,请将您的 JSON 散列内容包装在 %q{hsh} 标记中。

这似乎会自动添加所有必要的转义文本,如 WarHog 的答案。


t
the Tin Man

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

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


链接失效,请用最新链接更新答案。
M
Mario Ruiz

您可以使用 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]