在下面的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
答案 0 :(得分:1)
主要问题似乎是您写了"null"
而不是null
。
以下jq过滤器会产生所需的结果:
.RoleName + " " +
(.AssumeRolePolicyDocument.Statement[]
| select( .Principal.AWS? != null )
| .Principal.AWS
| if type == "array" then join("###") else tostring end )
为避免将此过滤器呈现给Windows解释器时出现问题,我建议将程序放在文件中,无论如何这可能是个好主意。