2015-08-01 3 views
1

Как я могу преобразовать входные данные в формате JSONпреобразовательные Вложенный массив объектов с помощью JQ

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

в

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

использованием jq?

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

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

ответ

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))'

+1

В зависимости от требований, отображение всех тегов может включать в себя слишком много. Таким образом, дополнительный вызов 'select' поможет ограничить использование. –

0

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

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