json 当子对象包含特定键时,选择父对象的键名称

0s7z1bwu  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(130)

给定以下JSON包含3个变量:

{
  "variables": {
    "AWS_ROLE": "DevOpsAccessRole",
    "AWS_REGION": {
      "description": "AWS region",
      "value": "us-west-2",
      "options": [
        "us-west-2",
        "us-east-1"
      ]
    },
    "ENVIRONMENT": {
      "description": "Environment to deploy to",
      "value": "dev",
      "options": [
        "dev",
        "qa",
        "prod"
      ]
    }
  }
}

我的目标是只选择包含description字段的变量名。
所以期望的输出是(不关心顺序):

AWS_REGION
ENVIRONMENT

AWS_ROLE应该被省略,因为它不包含description密钥。
我最初尝试过:
jq -r '.variables | keys []'
它返回:

AWS_ROLE
AWS_REGION
ENVIRONMENT

但是我被卡住了删除没有description的那些。
还尝试:
jq -r '.variables |..| select(.description?)'
但这里的问题是我无法访问变量名。
如何在jq中做到这一点?

v8wbuo2f

v8wbuo2f1#

使用to_entries可以同时访问.key.value,使用has测试是否存在(子)键,如果它不是对象(因此没有键,会出错),则使用?抑制错误。使用-r标志可以得到原始文本输出。

jq -r '.variables | to_entries[] | select(.value | has("description")?).key'
AWS_REGION
ENVIRONMENT

Demo
同样的技术使用keys,迭代并存储在变量中:

jq -r '.variables | keys[] as $k | .[$k] | select(has("description")?) | $k'

Demo

相关问题