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'

jqplay - demo(1)

或对数组进行转置并形成 k/v 对

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

jqplay - demo(2)

另一种方法是使用 to_entries | map(…) | from_entries,或其快捷方式 with_entries(…)

然后根据静态字符串和数字索引更改密钥:

jq 'with_entries(.key |= "lambda\(.+1)")'

Demo

或值中间部分的小写版本:

jq 'with_entries(.key = ((.value / "-")[1] | ascii_downcase))'

Demo

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