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")'
?