jq - выбрать объекты с заданным именем ключа

У меня есть произвольная структура со многими уровнями и т. Д. Мне нужно выбрать все объекты, которые содержат ключ с именем updateDate, Как мне сделать это с JQ? Я придумал один способ, но он также выдает ошибки на недопустимых типах данных, когда он посещает лист, который я должен вычленить:

jq 'recurse(.[]) | has("updateDate")' | grep -Fv error

Я не очень понимаю, как также проверять типы или листы, и я подозреваю, что есть более простой способ добиться того, чего я хочу?

2 ответа

Решение

В 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'

Принятый ответ также дает null для каждого объекта, у которого нет ключа.

Что сработало для меня:

jq '..|objects|.updateDate//empty'

.updateDate//empty часть означает: если .updateDate является null (или же false), пропустите это полностью.

Это, конечно, не сработает, если вы ожидаете, что ваш ключ будет иметь значения false или же null, В этом случае используйте это:

jq '..|objects|select(has("updateDate"))|.updateDate'

Не проверено: как насчет jq 'recurse(.[]?) | objects | has("updateDate")'?

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