从 variable-depth 嵌套的 JSON 值构建字符串

Build string from variable-depth nested JSON values

我正在尝试跟踪 tree-styled JSON object 中的所有分支,以从每个分支创建一个长的串联字符串。 children 的数量和每个节点的最大深度是未知的,因此必须将结果推广到任意数量。

我正在处理的数据类似于以下内容:

{
    "name":"root",
    "children": [
        {
            "name":"foo",
            "children":[
                {
                    "name":"bar",
                    "children":[]
                },
                {
                    "name":"baz",
                    "children":[]
                }
            ]
        },
        {
           "name":"zoo",
            "children": [
                {
                    "name":"zar",
                    "children": [
                        {
                            "name":"zaz",
                            "children": []
                        }   
                    ]
                }
            ]
        }
    ]
}

我在 this jqplay example 时差一点。

你可以看到这在只有一个 child 的原始情况下有效。我最困惑的地方是如何在多个 children 的情况下 "reset" parent。而不是递归
root -> foo -> bar -> baz
我想要
root -> foo -> bar
root -> foo -> baz

上面 jqplay 的期望输出:
"root/foo/bar" "root/foo/baz" "root/zoo/zar/zaz"

我更喜欢纯 jq 解决方案,通用 Bash 解决方案也可以。

由于您的数据结构是递归的,因此这里需要一个递归辅助函数:

def flat:
  [.name] + (.children[] // {} | if has("name") then flat else [] end);


flat | join("/") 

根据您的输入,使用 jq -r 的输出将是:

root/foo/bar
root/foo/baz
root/zoo/zar/zaz