按键递归搜索值

Recursive search values by key

我有一个 JSON 这样的:

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

end 我想找到 error 键的所有值,这些值不是 null.

对于我的示例,它应该 return

"error string"
"err str"

我该怎么做? jq可以吗?

..递归迭代,得到所有的.error值。如果它们是 null,请删除它们:

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

或者,您可以 select 字符串元素 strings:

而不是使用 empty
jq '.. | .error? | strings'

这是一个使用 tostreamselect

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