JSON 使用 JQ 将数组字面量转换为对象
JSON Array Literal to Object using JQ
我正在使用带有 json 输出的 AWS CLI 命令,它创建了一个数组:
aws lambda list-functions --region us-east-2 --query 'Functions[?starts_with(FunctionName, `DEV`) == `true`].FunctionName' --output json
哪个returns:
[
"DEV-Lambda1-xxxx",
"DEV-Lambda2-xxxx",
"DEV-Lambda3-xxxx",
"DEV-Lambda4-xxxx"
]
为了在我的 Terraform 中正确使用输出,我需要它是一个 JSON object。这是一个简化的例子:
{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}
我想使用 jq
1.5 或更高版本。如何将数组转置为对象?
我只能做到这一点:
map( { ("lambda"): . } ) | add
只输出最后一个 lambda:
{
"lambda": "DEV-Lambda4-xxxx"
}
您可以对数组进行范围迭代并形成所需的 k/v 对
jq '[ range(0; length) as $r |
{ ( .[$r] | split("-")[1] | ascii_downcase) : .[$r] } ] | add'
或对数组进行转置并形成 k/v 对
jq --slurp 'transpose |
map( { ( .[] | split("-")[1] | ascii_downcase) : .[] } ) | add'
另一种方法是使用 to_entries | map(…) | from_entries
,或其快捷方式 with_entries(…)
。
然后根据静态字符串和数字索引更改密钥:
jq 'with_entries(.key |= "lambda\(.+1)")'
或值中间部分的小写版本:
jq 'with_entries(.key = ((.value / "-")[1] | ascii_downcase))'
{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}
我正在使用带有 json 输出的 AWS CLI 命令,它创建了一个数组:
aws lambda list-functions --region us-east-2 --query 'Functions[?starts_with(FunctionName, `DEV`) == `true`].FunctionName' --output json
哪个returns:
[
"DEV-Lambda1-xxxx",
"DEV-Lambda2-xxxx",
"DEV-Lambda3-xxxx",
"DEV-Lambda4-xxxx"
]
为了在我的 Terraform 中正确使用输出,我需要它是一个 JSON object。这是一个简化的例子:
{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}
我想使用 jq
1.5 或更高版本。如何将数组转置为对象?
我只能做到这一点:
map( { ("lambda"): . } ) | add
只输出最后一个 lambda:
{
"lambda": "DEV-Lambda4-xxxx"
}
您可以对数组进行范围迭代并形成所需的 k/v 对
jq '[ range(0; length) as $r |
{ ( .[$r] | split("-")[1] | ascii_downcase) : .[$r] } ] | add'
或对数组进行转置并形成 k/v 对
jq --slurp 'transpose |
map( { ( .[] | split("-")[1] | ascii_downcase) : .[] } ) | add'
另一种方法是使用 to_entries | map(…) | from_entries
,或其快捷方式 with_entries(…)
。
然后根据静态字符串和数字索引更改密钥:
jq 'with_entries(.key |= "lambda\(.+1)")'
或值中间部分的小写版本:
jq 'with_entries(.key = ((.value / "-")[1] | ascii_downcase))'
{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}