从可变深度嵌套JSON值构建字符串

时间:2017-03-09 17:39:56

标签: json recursion tree jq recursive-datastructures

我试图跟踪树状JSON对象中的所有分支,以便从每个分支创建一个长的连接字符串。子节点数和每个节点的最大深度未知,因此结果必须推广到任何数量。

我使用的数据类似于以下内容:

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

我接近this jqplay example

你可以看到这种情况适用于只有一个孩子的幼稚情况。我最困惑的地方是如何重置"多个孩子的情景中的父母。而不是递归
root -> foo -> bar -> baz
我想要 root -> foo -> bar
root -> foo -> baz

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

我更喜欢纯粹的jq解决方案,一般的Bash解决方案也可以。

1 个答案:

答案 0 :(得分:0)

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

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