我试图跟踪树状JSON对象中的所有分支,以便从每个分支创建一个长的连接字符串。子节点数和每个节点的最大深度未知,因此结果必须推广到任何数量。
我使用的数据类似于以下内容:
{
"name":"root",
"children": [
{
"name":"foo",
"children":[
{
"name":"bar",
"children":[]
},
{
"name":"baz",
"children":[]
}
]
},
{
"name":"zoo",
"children": [
{
"name":"zar",
"children": [
{
"name":"zaz",
"children": []
}
]
}
]
}
]
}
你可以看到这种情况适用于只有一个孩子的幼稚情况。我最困惑的地方是如何重置"多个孩子的情景中的父母。而不是递归
root -> foo -> bar -> baz
我想要
root -> foo -> bar
root -> foo -> baz
上面jqplay的所需输出:
"root/foo/bar"
"root/foo/baz"
"root/zoo/zar/zaz"
我更喜欢纯粹的jq解决方案,一般的Bash解决方案也可以。
答案 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