Reputation: 353
I have a JSON like this:
{
"A": { "error": null },
"B": { "C": {"error": "error string"}},
"C": { "D": {"error": null}},
"D": { "error": "err str"}
}
end I want to find all values of error keys which are not null.
For my example it should return
"error string"
"err str"
How can I do it? Is it possible with jq?
Upvotes: 20
Views: 19760
Reputation: 14745
Here is a solution that uses tostream and select
tostream
| select(length==2 and .[0][-1]=="error" and .[1]!=null) as [$p,$v]
| $v
Upvotes: 4
Reputation:
Use ..
to iterate recursively, and get all the .error
values. If they're null
, remove them:
jq '.. | .error? // empty'
Alternatively, instead of using empty
you can select the elements that are strings with strings
:
jq '.. | .error? | strings'
Upvotes: 48