Условный запрос с использованием jq

У меня есть следующие данные JSON

[
    {
        "id": "001",
        "repoTags": {
            "docker/alpine": {
                "2.1.9": {
                    "vulnerable": "true",
                    "vulnerabilityCount": 19
                },
                "stable": {
                    "vulnerable": "true",
                    "vulnerabilityCount": 19
                }
            }
        }
    },
    {
        "id": "002",
        "repoTags": {
            "docker/alpine": {
                "3.0.0": {
                    "vulnerable": "false",
                    "vulnerabilityCount": 0
                }
            }
        }
    }
]

Я хочу получить значение поля id, но только для элемента, у которого repoTags = "3.0.0". Есть ли способ сделать этот условный запрос с помощью jq? Если нет, то какую альтернативу вы предлагаете?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
210
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вот фильтр думаю поможет

.[] | select(.repoTags | any(keys[] == "3.0.0")) | .id

с вашим вводом он производит

"002"

Если вам не нужны дополнительные кавычки в выводе, вы можете использовать опцию -r.

Попробуйте онлайн!

Не уверен, что поведение any определено, когда фильтр условий создает поток. Только что протестировал, и у меня есть неправильные результаты как с jq 1.5, так и с 1.6 в зависимости от порядка ввода элементов (попробуйте jq -n '[[1,2],[1]] | any(.[] == 1)' для примера). Кажется, это исправлено в основной версии, но я не знаю, просто ли это удача в моих примерах или фактическое недавнее исправление. Если сомневаетесь, я бы предложил select(.repoTags | any(has("3.0.0"))) как более безопасную альтернативу.

luciole75w 10.12.2020 11:06

Другие вопросы по теме