У меня есть следующие данные 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? Если нет, то какую альтернативу вы предлагаете?
вот фильтр думаю поможет
.[] | 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")))
как более безопасную альтернативу.