使用变量编辑嵌套数组中的值

Editing value in nested array using variables

我有以下无法解决的JQ问题。给定 JSON:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

我需要获取值 .Principal.AWS 并将其保存在变量 $orig 或其他内容中,然后将该变量作为一个元素重新添加到将成为新文档的数组中。

这几乎可以工作:

'.Statement[0]
    | .Principal.AWS as $orig
    | .Principal.AWS = [$orig] + ["foo", "bar"]'

然而,这样做,我失去了版本和声明级别。同时,这样做几乎可以满足我的要求:

'(.Statement[] | .Principal.AWS) = ["foo", "bar"]'

所以我希望这也能起作用,但它不起作用:

'(.Statement[] | .Principal.AWS as $orig | .Principal.AWS) = [$orig, "foo", "bar"]'

然后我得到一个无效的路径表达式错误。

如何更正此语法?预期结果是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": ["arn:aws:iam::111122223333:root", "foo", "bar"]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

您只需要对已经做得很好的尝试进行简单的添加即可。将 | 替换为 update assignment 并可选择分组到括号 (..) 中。 |= 之后的部分从 . 重新创建对象并分配给 LHS

上的路径
.Statement[0] |= ( .Principal.AWS as $orig | .Principal.AWS = [$orig] + ["foo", "bar"] )
#            ^^^

您只需要确保您不会在顶层使用管道更改输入上下文。赋值会保留输入,因此请尝试将过滤器编写为赋值。

中间变量是不必要的,你可以没有它。我会这样写:

.Statement[].Principal.AWS |= [(arrays // [.])[], "foo", "bar"]

如果 Principal.AWS 已经是一个数组,它只会将您的新值附加到该数组,否则假定当前值是新数组的第一项。