Мне нужен надежный метод для подсчета nbr ресурсов - PullRequest
0 голосов
/ 01 декабря 2019

У меня есть следующий JSON, который возвращается из API:

{
"Statement": [{
        "Sid": "Group1",
        "Resource": "arn:aws:ecs:*:777744445555:task-rendition/${aws:PrincipalTag/Service}-*:*",
        "Effect": "Allow"
    },
    {
        "Sid": "Group2",
        "Resource": [
            "arn:aws:ecs:*:777744445555:task-definition/${aws:PrincipalTag/Service}-*:*",
            "arn:aws:ecs:*:777744445555:task-petition/${aws:PrincipalTag/Service}-*:*",
            "arn:aws:ecs:*:777744445555:task-fruition/${aws:PrincipalTag/Service}-*:*"
        ],
        "Effect": "Allow"
    }

]}

Когда я применяю эти команды, я получаю ненадежные результаты:

.Statement [0] .Resource |длина -> 73 неверно .Statement [1] .Resource |длина -> 3 правильных

Первая команда выдает число, равное количеству символов в этой строке, а это не то, что мне нужно. Как я могу получить 1 и 3 более определенным способом?

Мой контекст - это сценарий оболочки bash на CentOS 7 и jq 1.5

Ответы [ 2 ]

2 голосов
/ 01 декабря 2019

Предполагая, что Resource может иметь тип string или array

.Statement[].Resource | if type == "array" then length else 1 end

будет выводить

1
3
1 голос
/ 02 декабря 2019

Для общего количества ресурсов, где бы они ни были указаны, вы можете рассмотреть:

def sigma(s): reduce s as $x (0; .+$x);

sigma(.. | objects | select(.Resource).Resource
      | if type == "array" then length else 1 end)
...