使用JQ将JSON数组文本转换为对象



我使用带有json输出的AWS CLI命令,它创建了一个数组:

aws lambda list-functions --region us-east-2 --query 'Functions[?starts_with(FunctionName, `DEV`) == `true`].FunctionName' --output json

哪个返回:

[
"DEV-Lambda1-xxxx",
"DEV-Lambda2-xxxx",
"DEV-Lambda3-xxxx",
"DEV-Lambda4-xxxx"
]

为了正确使用Terraform中的输出,我需要它是一个JSON对象。下面是一个简化的例子:

{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}

我想使用jq1.5或更高版本。如何将数组转换为对象?

我只能走到这一步:

map( { ("lambda"): . } ) | add 

只输出最后一个lambda:

{
"lambda": "DEV-Lambda4-xxxx"
}

您可以在数组上进行范围迭代,并形成所需的k/v对

jq '[ range(0; length) as $r | 
{ ( .[$r] | split("-")[1] | ascii_downcase) : .[$r] } ] | add'

jqplay-演示(1(

或者对阵列进行换位并形成k/v对

jq --slurp 'transpose | 
map( { ( .[] | split("-")[1] | ascii_downcase) : .[] } ) | add'

jqplay-演示(2(

另一种方法可以是使用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"
}

最新更新