【问题标题】:Convert Array to JSON, with Same Key, in Ruby在 Ruby 中使用相同的键将数组转换为 JSON
【发布时间】:2014-11-20 19:38:10
【问题描述】:

我正在尝试解析一个哈希数组,从特定键中获取一个值,然后使用每个值的一个预定义键输出到 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" }
但我不知道从哪里开始,或者我是否走在正确的轨道上。我怎样才能把它变成所需的输出?

谢谢,干杯!

【问题讨论】:

    标签: ruby arrays json hash


    【解决方案1】:

    这太复杂了:

    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"}]}
    

    【讨论】:

    • 不,数据是给Zabbix底层发现的,{#JONNAME}是一个宏。
    • 太棒了,现在看起来很简单。并感谢其他提示!
    • 编程时要学习的最重要的事情是识别问题中的模式。然后很容易抓住我们知道做某些事情的工具箱的一小部分,并正确地应用它们。它来自经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2020-12-16
    • 2018-07-13
    • 2010-10-18
    • 2016-02-05
    相关资源
    最近更新 更多