在Ruby中使用Same Key将Array转换为JSON

时间:2014-11-20 19:38:11

标签: ruby arrays json hash

我尝试解析哈希数组,从特定键中获取值,然后使用每个值的一个预定义键输出到json - 我被卡住了。

阵列:

[{:object_id=>"jon-59",
  :name=>"jon-59-gw (8db8fcae-055a-4b35-9f8f-739b68c0bd5d)",
  :client_handle=>nil,
  :extended_attributes=>nil,
  :appliances_summary=>
   {:vm_version=>"5.5.3",
    :vm_build_info=>"5.5.3-2135647"},
  :hypervisor_assist=>false,
  :allowed_actions=>
   {:string=>
     ["Change Log Level",
      "Edit Dns",
      "Edit Syslog"]},
  :edge_assist_id=>"0"},
 {:object_id=>"jon-60",
  :name=>"jon-60-gw (d63ddc45-gd3c-40c3-9046-e7afa996934a)",
  :client_handle=>nil,
  :extended_attributes=>nil,
  :appliances_summary=>
   {:vm_version=>"5.5.3",
    :vm_build_info=>"5.5.3-2168697"},
  :hypervisor_assist=>false,
  :allowed_actions=>
   {:string=>
     ["Change Log Level",
      "Edit Dns",
      "Edit Syslog"]},
  :edge_assist_id=>"0"}]

期望输出

{
  "data":[
    { "{#JONNAME}":"jon-59-gw" },
    { "{#JONNAME}":"jon-60-gw"},
  ]
}

我在哪里:

def jon_discover
  jon_summary.sort_by { |jon| jon[:object_id] }.each do |jon|
    name = jon[:name].slice!(/\A\S*/)
    my_hash = {'{#JONNAME}' => name}
    puts JSON.generate(my_hash)
  end
end

以上回报:

{ "{#JONNAME}":"jon-59-gw" }
{ "{#JONNAME}":"jon-60-gw" }
但我不知道从哪里拿走它,或者我是否走在正确的轨道上。如何将其输入所需的输出?

谢谢,干杯!

1 个答案:

答案 0 :(得分:3)

这太复杂了:

my_hash = {"{#JONNAME}" => "#{name}"}

保持简单:

my_hash = {JONNAME => name}

  

数据用于Zabbix低级别发现

然后使用单引号而不是双引号作为键,并使用裸name作为值:

my_hash = {'{#JONNAME}' => name}

所以更明显{#不是拼写错误。


而不是:

"jon-60-gw (d63ddc45-gd3c-40c3-9046-e7afa996934a)".slice!(/\A\S*/) # => "jon-60-gw"

使用:

"jon-60-gw (d63ddc45-gd3c-40c3-9046-e7afa996934a)".split.first # => "jon-60-gw"

全部放在一起:

require 'json'

ary = [
  {
    :object_id => "jon-59",
    :name => "jon-59-gw (8db8fcae-055a-4b35-9f8f-739b68c0bd5d)",
    :client_handle => nil,
    :extended_attributes => nil,
    :appliances_summary => 
    {
      :vm_version => "5.5.3",
      :vm_build_info => "5.5.3-2135647"
    },
    :hypervisor_assist => false,
    :allowed_actions =>  {
      :string =>  ["Change Log Level", "Edit Dns", "Edit Syslog"]
    },
    :edge_assist_id => "0"
  },
  {
    :object_id => "jon-60",
    :name => "jon-60-gw (d63ddc45-gd3c-40c3-9046-e7afa996934a)",
    :client_handle => nil,
    :extended_attributes => nil,
    :appliances_summary =>  {
      :vm_version => "5.5.3",
      :vm_build_info => "5.5.3-2168697"
    },
    :hypervisor_assist => false,
    :allowed_actions =>  {
      :string =>  ["Change Log Level", "Edit Dns", "Edit Syslog"]
    },
    :edge_assist_id => "0"
  }
]

以下是如何浏览数据:

data = ary.map{ |hash|
  {
    '{#JONNAME}' => hash[:name].split.first
  }
}

以下是生成JSON的方法:

puts JSON[{'data' => data}]
# >> {"data":[{"{#JONNAME}":"jon-59-gw"},{"{#JONNAME}":"jon-60-gw"}]}

如果您需要它排序:

puts JSON[{'data' => data.sort_by{ |s| s['{#JONNAME}'] }}]
# >> {"data":[{"{#JONNAME}":"jon-59-gw"},{"{#JONNAME}":"jon-60-gw"}]}