使用 jq 转换嵌套对象数组

Transforming nested array of objects using jq

如何转换 JSON 输入

{
"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 或者减少吗?

是的,您可以使用 from_entries。在jq 1.5rc1及以上版本中,定义为取Key/Value键名以及key/value.

试试这样的东西:

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

在以前的版本中,您可以在将 "entries" 传递给 from_entries 之前修改它们:

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

这是一个只使用 jq 原语的解决方案。

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