2014-04-24 7 views
10

Ho una struttura arbitraria con molti livelli, ecc. Devo selezionare tutti gli oggetti che contengono una chiave denominata updateDate. Come faccio a farlo con jq? Mi si avvicinò con un modo, ma produce anche gli errori sui tipi di dati non validi quando si visita una foglia che devo grep out:jq - seleziona gli oggetti con il nome dato

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

Io non capisco come controllare anche per i tipi o foglie ed io sospetto c'è un modo più semplice per ottenere ciò che voglio?

risposta

14

In 1.4 si può solo:

jq '..|.updateDate?' 

Se sei bloccato con 1.3 è possibile utilizzare un programma più lungo in questo modo:

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

Questo errore verrà generato quando la struttura include matrici. Aggiungendo '| objects |' nel mezzo lo corregge, penso. – Tgr

1

Non testato: come su jq 'recurse(.[]?) | objects | has("updateDate")'?

+1

recurse (. []?) | oggetti | select (ha ("a")) –