【问题标题】:Ruby & fetching hash values magicRuby & 获取哈希值魔法
【发布时间】:2018-03-04 22:03:38
【问题描述】:

我正在尝试解析 JSON 数据并创建自己的字典来显示数据的子集。问题是,我注意到我的输入数据会根据扫描的内容(使用 nmap)而变化。有些元素可能是数组值,而有些可能不是。组合似乎相当广泛。

例如,这是最简单的输入,其中只找到了一个 IP 地址:

{
  'host' => {
    'address' => {
      'addr' => '192.168.0.1'
    },
    'status' => {...}
  }
}

然后,可能会找到 IP 和 MAC 地址:

{
  'host' => {
    'address' => [{
      'addrtype' => 'ipv4',
      'addr' => '192.168.0.1',
     },{
      'addrtype' => 'mac',
      'mac' => '00:AA:BB:CC:DD:EE',
     },
    'status' => {...}
  }]
}

这些只是几个例子。我见过的其他变体:

`host.class` = Array
`address.class` = Hash
`host['status'].class` = Array
etc...

当我解析输出时,我首先检查元素是否为数组,如果是,我以一种方式访问​​键/值,而如果它不是数组,我基本上必须复制我的代码稍加调整,似乎不是很有说服力:

hash = {}
  if hosts.class == Array
    hosts.each do |host|
      ip = if host['address'].class == Array
             host['address'][0]['addr']
           else
             host['address']['addr']
           end
      hash[ip] = {}
    end
  else
    ip = if hosts['address'].class == Array
           hosts['address'][0]['addr']
         else
           hosts['address']['addr']
         end
    hash[ip] = {}
  end
  puts hash
end

最后,我只是想找到一种更好/更有说服力的方法来生成如下所示的哈希,同时考虑元素可能/可能不是数组的可能性:

{
 '192.168.0.1' => {
   'mac' => '00:aa:bb:cc:dd:ee',
   'vendor' => 'Apple',
   'ports' => {
      '80' => {
        'status' => 'open',
        'service' => 'httpd'
      }
      '443' => {
        'status' => 'filtered',
        'service' => 'httpd'
      }
    }
 },
 192.168.0.2 => {
   ...
 }
}

如果有一个我还没有遇到过的 ruby​​ 方法会让这更流畅?

【问题讨论】:

    标签: ruby-on-rails json ruby


    【解决方案1】:

    不是真的...但您可以使其始终成为数组,例如通过执行以下操作:

    hosts = [hosts] unless hosts.is_a?(Array)
    

    或类似的...然后将其传递给您现在不重复的代码。 :)

    【讨论】:

    • hosts = Array(hosts)(可能会或可能不会超出预期)。
    • 因为您使用的是 Rails,所以这看起来像 Array#wrap 的教科书案例。建议的答案会给出一些意想不到的结果;例如,如果hosts == nil 你会得到[nil]
    【解决方案2】:

    您的问题中的 20 行代码可以使用 Array#wrap 而不是条件句,并使用 Enumerable#map 而不是 Enumerable#each 减少为一行:

    Array.wrap(hosts).map { |host| [Array.wrap(host['address']).first['addr'], {}] }.to_h
    

    这太神奇了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2013-11-27
      相关资源
      最近更新 更多