Преобразование вложенного массива объектов с помощью jq

Как я могу преобразовать ввод JSON

{
"Subnets": [
    {
        "VpcId": "vpc-xxx",
        "Tags": [
            {
                "Value": "staging_subnet_private_a",
                "Key": "Name"
            }
        ],
        "SubnetId": "subnet-xxx"
    },
    ...
    ]
}

to

[
 {
  "SubnetId": "subnet-xxx",
  "Name": "staging_subnet_private_a"
 },
 ...
]

используя jq?

У меня есть рабочее решение, использующее jq '[.Subnets[] | {SubnetId, Name: .Tags[0] | .Value }]', но оно зависит от порядка тегов (не очень хорошо).

Могу ли я использовать from_entires или, может быть, уменьшить?


person ebaxt    schedule 01.08.2015    source источник


Ответы (2)


Да, вы можете использовать from_entries. В jq 1.5rc1 и выше он определяется как принимающий имена клавиш Key/Value, а также key/value.

Попробуйте что-то вроде:

jq '.Subnets | map({SubnetId} + (.Tags | from_entries))'

В предыдущих версиях вы могли изменить «записи» перед передачей их в from_entries:

jq '.Subnets | map({SubnetId} + (.Tags | map({value: .Value, key: .Key}) | from_entries))'

person Community    schedule 01.08.2015
comment
В зависимости от требований сопоставление всех тегов может включать слишком много. Таким образом, дополнительный вызов select помог бы ограничить то, что используется. - person Jeff Mercado; 01.08.2015

Вот решение, которое использует только примитивы jq.

[
  .Subnets[]
| {SubnetId} + (.Tags[] | if .Key=="Name" then {Name:.Value} else empty end)
]
person jq170727    schedule 25.08.2017