使用 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 ]

Online demo

这是一个直接的解决方案,不涉及辅助函数,实际上解决了一个更一般的问题。它基于这样的想法:首先为每个 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 // "")}