2016-07-19 7 views
3

habe ich eine JSON wie folgt aus:rekursive Suchwerte durch Tasten

{ 
    "A": { "error": null }, 
    "B": { "C": {"error": "error string"}}, 
    "C": { "D": {"error": null}}, 
    "D": { "error": "err str"} 
} 

Ende ich alle Werte von Fehler Schlüssel finden wollen, die nicht null.

Für mein Beispiel sollte es

zurückkehren
"error string" 
"err str" 

Wie kann ich es tun? Ist es möglich mit jq?

+0

wo Ihr Code a Versuch? –

+0

Ich versuchte Dinge wie 'jq 'wählen (.error! = Null)' file.json ', aber es rekursiv nicht. – Ardling

+1

Haben Sie versucht, 'jq suche rekursiv' zu suchen? – 123

Antwort

6

Verwenden Sie .., um rekursiv zu iterieren und alle .error Werte zu erhalten. Wenn sie null sind, entfernen Sie sie:

jq '.. | .error? // empty' 

Alternativ kann anstelle empty der Verwendung können Sie die Elemente auswählen, die Saiten mit strings sind:

jq '.. | .error? | strings' 
0

Hier ist eine Lösung, die ToStream verwendet und wählen

tostream 
| select(length==2 and .[0][-1]=="error" and .[1]!=null) as [$p,$v] 
| $v