如何使用参数作为新对象的键?

时间:2018-09-22 01:23:10

标签: syntax key expression jq

我正在修改某些技巧以添加AWS api网关集成,并且目前仍停留在此问题上。

使用此代码,我无法生成安全对象​​。

我遇到了错误:

jq: error: syntax error, unexpected ':', expecting '}' (Unix shell quoting issues?) at <top-level>, line 6: .value.security |= [ { $authorizer_name : map(.) }]

今天这使我疯狂。

任何人都可以阐明这一点吗?

这是一个小复制品。

INPUT='{
  "swagger": "2.0",
  "paths": {
    "integrations/systems/{system_id}/configurations": {
      "get": {
        "security": [
          "https://api.com/internal-api"
        ]
      }
    }
  }
}'

AUTHORIZER_NAME="cognito_user_pool"

jq --arg authorizer_name "${AUTHORIZER_NAME}" \
'.info.title |= "API" 
| .info.description |= "REST API" 
| .paths |= with_entries(
    .value |= with_entries(
      .value.security |= [ { $authorizer_name : "stuff" }]
    )
  )' <<< "${INPUT}"

编辑:

解决方案是用()括住参数。 .value.security |= [ { ($authorizer_name) : "stuff" }]

1 个答案:

答案 0 :(得分:1)

如@JeffMercado所建议,如果将$authorizer_name括在括号中,则问题将消失:

{ ($authorizer_name) : "stuff" }

要点是,当使用此处的对象构造语法时,每个指定键名的表达式都必须用括号括起来,除非它是JSON字符串。