【问题标题】:Inner select on json when key is either string or array?当键是字符串或数组时,json上的内部选择?
【发布时间】:2021-08-18 13:58:29
【问题描述】:

我正在使用 AWS S3 策略,我在其中得到了这个 JSON(白洗):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn1",
          "arn2",
          "arn3"
        ]
      },
      "Action": [
        "access1",
        "access2",
        "access3"
      ],
      "Resource": "arn:aws:s3:::bucket1/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn1",
          "arn2",
          "arn3"
        ]
      },
      "Action": "access4",
      "Resource": "arn:aws:s3:::bucket1"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "KEY1"
      },
      "Action": [
        "access5",
        "access4"
      ],
      "Resource": "arn:aws:s3:::bucket1"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "KEY1"
      },
      "Action": [
        "access2",
        "access3",
        "access1"
      ],
      "Resource": "arn:aws:s3:::bucket1/directory/*"
    }
  ]
}

我需要过滤掉这两个(最后一个)具有“AWS:KEY1”的数组,只留下前两个(具有“AWS:[arnX]”的数组。

正如,这就是我想要/需要的:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn1",
          "arn2",
          "arn3"
        ]
      },
      "Action": [
        "access1",
        "access2",
        "access3"
      ],
      "Resource": "arn:aws:s3:::bucket1/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn1",
          "arn2",
          "arn3"
        ]
      },
      "Action": "access4",
      "Resource": "arn:aws:s3:::bucket1"
    }
  ]
}

但我不知道该怎么做! 'AWS' 是 either 字符串 相同 JSON 中的数组!不知道如何同时处理两者..

我尝试使用flatten 将其转换为数组,但似乎无法对其进行select()。或者,然后返回整个 JSON(没有我不想要的部分)。

$ cat /tmp/y | jq '.Statement[].Principal.AWS | [.] | flatten'
[
  "arn1",
  "arn2",
  "arn3"
]
[
  "arn1",
  "arn2",
  "arn3"
]
[
  "KEY1"
]
[
  "KEY1"
]

【问题讨论】:

    标签: json jq


    【解决方案1】:

    试试:

    .Statement|=map(select([.Principal.AWS]|flatten|all(.!="KEY1")))
    

    [.Principal.AWS]|flatten 位可以确保您拥有一个字符串列表而不是单个字符串。 all(.!="KEY1") 测试以确保“KEY1”不在列表中。 map(select(...)) 只保留与测试匹配的语句。

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2022-12-02
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多