如何从json文件创建具有重复值计数的哈希

yyyllmsg  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(274)

我从控制台生成了一个json文件,并希望对其进行解析,以便查看在哪个版本和哪个操作系统上运行了多少节点。
json示例:

[
 {
 "facts.aio_agent_version": "7.9.0",
 "facts.operatingsystem": "windows"
 },
 {
 "facts.aio_agent_version": "7.8.0",
 "facts.operatingsystem": "windows"
 },
 {
 "facts.aio_agent_version": "7.9.0",
 "facts.operatingsystem": "CentOS"
 },
 {
 "facts.aio_agent_version": "7.9.0",
 "facts.operatingsystem": "CentOS"
 },
 {
 "facts.aio_agent_version": "7.8.0",
 "facts.operatingsystem": "CentOS"
 }
]

我需要一个ruby哈希的输出:

{"CentOS"=>"7.8.0"=>"nodes"=> 1, "CentOS"=>"7.9.0"=>"nodes"=> 2, "windows"=>"7.8.0"=>"nodes"=> 1, "windows"=>"7.9.0"=>"nodes"=> 1}

这是我所能做到的:

require 'json'

file = File.read('./data.json')

hash = JSON.parse(file)

hash2 = {}

hash.each { |key| 
    if !hash2.key?(key["facts.operatingsystem"]=>key["facts.aio_agent_version"])

        hash2[key["facts.operatingsystem"]] = key["facts.aio_agent_version"] = "node"
    else
        hash2[key["facts.operatingsystem"]["facts.aio_agent_version"]["node"]] =+ 1

    end
}

puts hash2

输出:

{"windows"=>"node", "CentOS"=>"node"}
ndh0cuux

ndh0cuux1#

json = File.read('./data.json')
array = JSON.parse(json)
result = {}
array.each do |hash|
  os = hash['facts.operatingsystem']
  version = hash['facts.aio_agent_version']
  count = result.dig(os, version, 'nodes')
  if count
    result[os][version]['nodes'] = count + 1
  else
    result[os] = { version => { 'nodes' => 1 } }.merge(result[os] || {})
  end
end

puts result

对于数组中的每一个散列,我们都会深入查看结果散列,以确定之前是否看到了一个节点。如果我们这样做了,我们会增加计数。如果没有,则在结果哈希中创建节点。由于操作系统可以有多个版本,我们将现有节点与新创建的节点合并。

相关问题