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'