从 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
我正在尝试跟踪 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