【发布时间】: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