使用 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)
]
如何转换 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)
]