使用 JQ 展平分层 JSON 数组
Flatten a hierarchical JSON array using JQ
任何人都可以帮助我获得正确的 jq 命令来展平下面的示例吗?我看过其他一些帖子,我正在研究它,但似乎无法理解。如果有任何帮助,我将不胜感激。
输入:
[
{
"name": "level1",
"children": [
{
"name": "level2",
"children": [
{
"name": "level3-1",
"children": []
},
{
"name": "level3-2",
"children": []
}
]
}
]
}
]
输出:
[
{
"displayName": "level1",
"parent": ""
},
{
"displayName": "level2",
"parent": "level1"
},
{
"displayName": "level3-1",
"parent": "level2"
},
{
"displayName": "level3-2",
"parent": "level2"
}
]
用一个简单的递归函数:
def f: .name as $parent | .children[] | {$parent, displayName: .name}, f;
[ {name: "", children: .} | f ]
这是一个直接的解决方案,不涉及辅助函数,实际上解决了一个更一般的问题。它基于这样的想法:首先为每个 child 添加一个“parent”键,然后使用 ..
收集所有 name/parent 对。
所以首先考虑:
[ walk(if type=="object" and has("children")
then .name as $n | .children |= map(.parent = $n)
else . end)
| ..
| select(type=="object" and has("name"))
| {displayName: .name, parent}
]
除了top-level(parentless)object,这满足了要求,它产生了 null
的 .parent 值。这通常比 "" 多 JSON-esque,但如果确实需要空字符串,只需将上面的最后 non-trivial 行替换为:
| {displayName: .name, parent: (.parent // "")}
任何人都可以帮助我获得正确的 jq 命令来展平下面的示例吗?我看过其他一些帖子,我正在研究它,但似乎无法理解。如果有任何帮助,我将不胜感激。
输入:
[
{
"name": "level1",
"children": [
{
"name": "level2",
"children": [
{
"name": "level3-1",
"children": []
},
{
"name": "level3-2",
"children": []
}
]
}
]
}
]
输出:
[
{
"displayName": "level1",
"parent": ""
},
{
"displayName": "level2",
"parent": "level1"
},
{
"displayName": "level3-1",
"parent": "level2"
},
{
"displayName": "level3-2",
"parent": "level2"
}
]
用一个简单的递归函数:
def f: .name as $parent | .children[] | {$parent, displayName: .name}, f;
[ {name: "", children: .} | f ]
这是一个直接的解决方案,不涉及辅助函数,实际上解决了一个更一般的问题。它基于这样的想法:首先为每个 child 添加一个“parent”键,然后使用 ..
收集所有 name/parent 对。
所以首先考虑:
[ walk(if type=="object" and has("children")
then .name as $n | .children |= map(.parent = $n)
else . end)
| ..
| select(type=="object" and has("name"))
| {displayName: .name, parent}
]
除了top-level(parentless)object,这满足了要求,它产生了 null
的 .parent 值。这通常比 "" 多 JSON-esque,但如果确实需要空字符串,只需将上面的最后 non-trivial 行替换为:
| {displayName: .name, parent: (.parent // "")}