I have a JSON like this:
{ \"A\": { \"error\": null }, \"B\": { \"C\": {\"error\": \"error string\"}}, \"C\": { \"D\": {\"error\": null}}, \"D\": {
Use .. to iterate recursively, and get all the .error values. If they're null, remove them:
..
.error
null
jq '.. | .error? // empty'
Alternatively, instead of using empty you can select the elements that are strings with strings:
empty
strings
jq '.. | .error? | strings'