我正在使用ELK Stack Logstash,这是我现在需要转换的“目标”数据字段的格式:
{
"target": [
"Sector1 - Subsector1",
"Sector2 - Subsector2"
]
}
我需要的所需JSON输出格式:
{
"target": [{
"Sector": "Sector1",
"Subsector": "Subsector1"
}, {
"Sector": "Sector2",
"Subsector": "Subsector2"
}]
}
我已经进行了一些研究,发现Logstash Ruby过滤器能够执行转换,但是我不精通Ruby,因此,如果这里的任何专业人士可以帮助您编写代码,将不胜感激!>
答案 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"}]}