Ruby将嵌套数组字段转换为嵌套JSON对象

时间:2018-10-24 09:14:23

标签: arrays json ruby nested logstash

我正在使用ELK Stack Logstash,这是我现在需要转换的“目标”数据字段的格式:

{
    "target": [
        "Sector1 - Subsector1",
        "Sector2 - Subsector2"
    ]
}

我需要的所需JSON输出格式:

{
    "target": [{
        "Sector": "Sector1",
        "Subsector": "Subsector1"
    }, {
        "Sector": "Sector2",
        "Subsector": "Subsector2"
    }]
}

我已经进行了一些研究,发现Logstash Ruby过滤器能够执行转换,但是我不精通Ruby,因此,如果这里的任何专业人士可以帮助您编写代码,将不胜感激!

3 个答案:

答案 0 :(得分:0)

假设输入为JSON:

require 'json'

json = <<-EOF
{
    "target": [
        "Sector1 - Subsector1",
        "Sector2 - Subsector2"
    ]
}
EOF


data = JSON.parse(json)
data['target'].map! { |line|
  line.split(' - ').map { |str| [str[/^.*(?=\d+$)/], str] }.to_h
}
json = JSON.dump(data)

map!将就地替换target;对于每个元素,用破折号分隔,通过省略部分末尾的数字来从每个部分中提取密钥,并从[key, part]对集合中进行哈希处理。

编辑:如果输入不是JSON,而是Ruby Hash(已经在data变量中),则将data["target"]更改为data[:target]

答案 1 :(得分:0)

此方法采用示例输入数据,并将其定义为ruby哈希,然后修改数据,然后将其格式化回json。另外,我在这里使用的样式旨在让红宝石新手更易读。

require 'json'

data = {
    "target": [
        "Sector1 - Subsector1",
        "Sector2 - Subsector2"
    ]
}

data[:target] = [
  data[:target].inject({}) do |str, index|
    str[index.split(' - ')[0]] = index.split(' - ')[1]
    str
  end
]

json = data.to_json
puts json
#=>{"target":[{"Sector1":"Subsector1","Sector2":"Subsector2"}]}

答案 2 :(得分:0)

其他选项:

require 'json'

data.transform_values { |v| v.map { |e| {Sector: e.split(" - ").first, Subsector: e.split(" - ").last } } }.to_json

#=> {"target":[{"Sector":"Sector1","Subsector":"Subsector1"},{"Sector":"Sector2","Subsector":"Subsector2"}]}