如何使用 jq 有条件地生成所有 JSON 路径

lem*_*lem 1 json path jq

我有任意嵌套的 JSON 对象,类似于下面的内容。

{
  "parent1" : "someval"`,
  "parent2" : {
     "a" : "someval",
     "b" : "someval"
   },
  "parent3" : {
     "child1" : { 
        "a" : "someval"
      },
     "child2" : { 
        "b" : "someval"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我需要递归地遍历它们并检查是否有任何父项有子键ab或两者,并生成该父项的 JSON 路径,如下所示:

Output:
parent2 
parent3.child1
parent3.child2
Run Code Online (Sandbox Code Playgroud)

我尝试过使用

jq -r 'path(..) | map (. | tostring) | join (".")
Run Code Online (Sandbox Code Playgroud)

这可以帮助我生成所有路径,但我还没有找到一种方法来成功地组合诸如 之类的has("a")条件path。我怎样才能实现这一目标?

0st*_*ne0 5

您可以使用index检查键是否在path数组中:

path(..) | select(index("a") or index("b")) | join(".")
Run Code Online (Sandbox Code Playgroud)
"parent2.a"
"parent2.b"
"parent3.child1.a"
"parent3.child2.b"
Run Code Online (Sandbox Code Playgroud)

JqPlay演示


如果您不需要最后一个键,可以添加[:-1]“删除”每个数组中的最后一个索引以输出:

path(..) | select(index("a") or index("b")) | join(".")
Run Code Online (Sandbox Code Playgroud)
"parent2.a"
"parent2.b"
"parent3.child1.a"
"parent3.child2.b"
Run Code Online (Sandbox Code Playgroud)

JqPlay演示