ruby - 访问哈希值和数组 Ruby

标签 ruby json symbols

在我的 Rails 应用程序中,我发送了一个需要解码的复杂 JSON 字符串。这不是我知道的问题。

现在,在实现所有内容之前,我尝试访问一些示例 JSON 结构,看看是否可以获取所有变量。问题是名称可能是可变的。

{"configurations" : [ 
{ "drinks" : [
        {"menus" : [
          { "hot" : [
            {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 4},
            {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 6}
          ] },

          { "cold" : [
        {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 4},
            {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 6}
           ] },

          { "terminals" : [ {"id" : 4}, {"id": 6}, {"id": 7} ] }, 

          { "keys" : { "debit" : "on", "credit": "off" }  }

        ] }
] } ] } 

好的,现在以下字段是可变的:“饮料”、“热”、“冷”。所有其他字段都将被称为相同的。

现在我想在解码后访问此 JSON 字符串中的每个变量。在实现之前,我尝试了一个简单的 JSON:

{"configuration" : [ { "drinks" : [ { "id":15, "unit":"0.33" } ] } ] }

在轨中解码后得到

{ "configuration" => [{"drinks" => [{"id" => 15, "unit" => "0.33" }]}]}

现在如何在不使用“drinks”一词的情况下访问例如idunit。该解决方案还应该可扩展到上面的示例。

一些额外信息:在大型 JSON 中,我应该访问那里列出的所有项目(id),将它们保存到表中并返回新 id,然后将其插入到 JSON 中。 (解释为什么需要这样做将需要额外的页面或 4 ^^)。

最佳答案

我写这个是为了在哈希中进行深度搜索,但首先我担心你的 json 有问题,当你解析它时你会得到这个,你会注意到例如终端不显示所有键。代码仍然需要修改以返回数组或哈希本身。

hash = JSON.parse(string) #the string you published
=>

{"configurations"=>
  [{"drinks"=>
     [{"menus"=>
        [{"hot"=>
           [{"id"=>15,
             "unit"=>"0.33",
             "price"=>"1",
             "currency"=>"Euro",
             "position"=>4},
            {"id"=>15,
             "unit"=>"0.33",
             "price"=>"1",
             "currency"=>"Euro",
             "position"=>6}]},
         {"cold"=>
           [{"id"=>15,
             "unit"=>"0.33",
             "price"=>"1",
             "currency"=>"Euro",
             "position"=>4},
            {"id"=>15,
             "unit"=>"0.33",
             "price"=>"1",
             "currency"=>"Euro",
             "position"=>6}]},
         {"terminals"=>{"id"=>7}},
         {"keys"=>{"debit"=>"on", "credit"=>"off"}}]}]}]}

这里是代码

class Hash
  def dseek(search_key = "", path = "")
    self.each do|key, value|
      if value.is_a?(Hash)
        path += "#{key}."
        value.dseek(search_key, path)
      else
        if value.is_a?(Array)
          path += "#{key}."
          value.each do |val|
            val.dseek(search_key, path)
          end
        else
          puts "#{path}#{key}:#{value}" if search_key === key || search_key === ""
        end
      end
    end
  end
end


hash.dseek

给出

configurations.drinks.menus.hot.id:15
configurations.drinks.menus.hot.unit:0.33
configurations.drinks.menus.hot.price:1
configurations.drinks.menus.hot.currency:Euro
configurations.drinks.menus.hot.position:4
configurations.drinks.menus.hot.id:15
configurations.drinks.menus.hot.unit:0.33
configurations.drinks.menus.hot.price:1
configurations.drinks.menus.hot.currency:Euro
configurations.drinks.menus.hot.position:6
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.cold.unit:0.33
configurations.drinks.menus.cold.price:1
configurations.drinks.menus.cold.currency:Euro
configurations.drinks.menus.cold.position:4
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.cold.unit:0.33
configurations.drinks.menus.cold.price:1
configurations.drinks.menus.cold.currency:Euro
configurations.drinks.menus.cold.position:6
configurations.drinks.menus.terminals.id:7
configurations.drinks.menus.keys.debit:on
configurations.drinks.menus.keys.credit:off

hash.dseek("id")

给出

configurations.drinks.menus.hot.id:15
configurations.drinks.menus.hot.id:15
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.terminals.id:7

关于ruby - 访问哈希值和数组 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10460504/

相关文章:

c++ - 用于在 Windows 中调试的符号表

java - 9位除以11的和为10时返回 'X'

ruby-on-rails - Ruby 变量如何以及何时实例化

ruby - 即使安装后也无法使用 ruby​​ 2.1.0

javascript - 如何在本地存储(或其他地方)中保存 ES6 map ?

javascript - 未捕获的 TypeError : d. type.toUpperCase 不是函数

xml - 使用 XSLT 将 XML 转换为 JSON 并删除命名空间

VIM:如何在不使用非文本颜色元素的情况下更改 Showbreak Highlight 颜色

ruby - Chef LWRP 的属性方法是什么?我可以传递什么?

ruby - 在RSpec中,stub!有什么区别? stub ?