使用jq转换嵌套对象数组

3

如何转换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或reduce吗?

2个回答

5

是的,你可以使用from_entries。在jq 1.5rc1及以上版本中,它被定义为接受Key/Value键名以及key/value

尝试这样做:

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

在早期版本中,您可以在传递给from_entries之前修改“entries”:

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


1
根据需求,映射所有标签可能会包含太多内容。因此,额外的“select”调用可以帮助限制使用的内容。 - Jeff Mercado

1
这是一个仅使用jq基元的解决方案。
[
  .Subnets[]
| {SubnetId} + (.Tags[] | if .Key=="Name" then {Name:.Value} else empty end)
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接