Ruby для преобразования поля вложенного массива во вложенные объекты JSON - PullRequest
0 голосов
/ 24 октября 2018

Я использую ELK Stack Logstash, и это формат целевого поля данных, которое мне нужно преобразовать сейчас:

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

Требуемый формат вывода JSON, который мне нужен:

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

Я провел некоторое исследование и обнаружил, что фильтр Logstash Ruby способен выполнять преобразование, однако я не разбираюсь в Ruby, поэтому, если кто-то из профессионалов сможет помочь с кодом, он будет очень признателен!

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Этот подход берет ваш пример входных данных и определяет его как хэш 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"}]}
0 голосов
/ 24 октября 2018

Другой вариант:

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"}]}
0 голосов
/ 24 октября 2018

Предполагая, что вводом является 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].

...