从字段的数组和对象中提取值

时间:2019-10-12 07:39:01

标签: json if-statement jq

在下面的json中,.Principal.AWS包含一个值,另一个包含值数组。如果它是一个数组,我正在使用join合并值,然后对于对象,我会报错

jq:错误(在stackflow.json:46处):无法遍历字符串(“ arn:aws:ia ...)

我甚至通过使用if type =“ array”来尝试jq,但遇到错误。

E:\python_test>jq-win32.exe -r ".RoleName + \"  \" + (.AssumeRolePolicyDocument.Statement[] | select (.Principal.AWS? != "null") | (.Principal.AWS |join (\"###\")) ) "  stackflow.json

allow-test-account-to-hostedzones  arn:aws:iam::426544XX7585196:root###arn:aws:iam::640XXX556689289:root
jq: error (at stackflow.json:46): Cannot iterate over string ("arn:aws:ia...)
{
    "RoleName": "AccessKeyRotation-LambdaRole",
    "AssumeRolePolicyDocument": {
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
}
{
    "RoleName": "allow-test-account-to-hostedzones",
    "AssumeRolePolicyDocument": {
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::426544XX7585196:root",
                        "arn:aws:iam::640XXX556689289:root"
                    ]
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
}
{
    "RoleName": "allow-test-env-access-to-route53",
    "AssumeRolePolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::445666XX779289:root"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
}

预期结果是

allow-test-account-to-hostedzones arn:aws:iam::426544XX7585196:root###arn:aws:iam::640XXX556689289:root
allow-test-env-access-to-route53 arn:aws:iam::445666XX779289:root

1 个答案:

答案 0 :(得分:1)

主要问题似乎是您写了"null"而不是null

以下jq过滤器会产生所需的结果:

.RoleName + " " +
  (.AssumeRolePolicyDocument.Statement[]
   | select( .Principal.AWS? != null )
   | .Principal.AWS
   | if type == "array" then join("###") else tostring end )

为避免将此过滤器呈现给Windows解释器时出现问题,我建议将程序放在文件中,无论如何这可能是个好主意。