使用jq转换嵌套的对象数组

时间:2015-08-01 16:57:11

标签: json 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还是减少?

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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