Jq - выбор объектов с заданным именем ключа
У меня есть произвольная структура со многими уровнями и т.д. Мне нужно выбрать все объекты, содержащие ключ с именем updateDate
. Как это сделать с помощью jq? Я придумал один путь, но он также создает ошибки в недопустимых типах данных, когда он посещает лист, который я должен вывести:
jq 'recurse(.[]) | has("updateDate")' | grep -Fv error
Я действительно не понимаю, как проверить типы или листья, и я подозреваю, что существует более простой способ добиться того, что я хочу?
Ответы
Ответ 1
В 1.4 вы можете просто:
jq '..|.updateDate?'
Если вы застряли в 1.3, вы можете использовать более длинную программу:
jq 'recurse(if type == "array" or type = "object" then .[] else empty end) | if type == "object" then .updateDate else empty end'
Ответ 2
Не тестировалось: как насчет jq 'recurse(.[]?) | objects | has("updateDate")'
?
Ответ 3
Принятый ответ также выдает null
для каждого объекта, у которого нет ключа.
Что для меня работало:
jq '..|objects|.updateDate//empty'
.updateDate//empty
означает: если .updateDate
имеет значение null
(или false
), пропустите его полностью.
Это, конечно, не сработает, если вы ожидаете, что ваш ключ будет иметь значения false
или null
. В этом случае используйте следующее:
jq '..|objects|select(has("updateDate"))|.updateDate'