2014-04-24 6 views
10

Ich habe eine beliebige Struktur mit vielen Ebenen, etc. Ich muss alle Objekte auswählen, die einen Schlüssel mit dem Namen enthalten. Wie mache ich das mit jq? Ich kam mit einer Art und Weise, aber es produziert auch Fehler auf ungültigen Datentypen, wenn sie ein Blatt besucht, die ich habe grep aus:jq - Wählen Sie Objekte mit gegebenem Schlüsselname

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

Ich verstehe nicht wirklich, wie auch für die Typen oder Blätter zu überprüfen und mich vermute, es gibt einen einfacheren Weg, um zu erreichen, was ich will?

Antwort

14

In 1.4 können Sie einfach:

jq '..|.updateDate?' 

Wenn Sie mit 1.3 stecken können Sie ein längeres Programm wie so verwenden:

jq 'recurse(if type == "array" or type = "object" then .[] else empty end) | if type == "object" then .updateDate else empty end' 
+0

Dies führt zu einem Fehler, wenn die Struktur Arrays enthält. Hinzufügen von '| objects |' in der Mitte behebt es, denke ich. – Tgr

1

Nicht getestet: Wie wäre es jq 'recurse(.[]?) | objects | has("updateDate")'?

+1

recurse (. []?) | Objekte | auswählen (hat ("a")) –

Verwandte Themen