【问题标题】:How to convert JSON to a Ruby hash如何将 JSON 转换为 Ruby 哈希
【发布时间】: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 哈希?

【问题讨论】:

    标签: ruby json hashmap


    【解决方案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 散列内容包装在 %q{hsh} 标签中。

    这似乎会自动添加所有必要的转义文本,就像 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-12
          • 1970-01-01
          • 2013-11-13
          • 1970-01-01
          • 2010-12-16
          • 1970-01-01
          • 1970-01-01
          • 2016-09-14
          相关资源
          最近更新 更多