使用JQ展平分层JSON数组

时间:2020-07-31 14:57:50

标签: arrays json jq flatten

有人可以帮助我获取正确的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"
    }
]

2 个答案:

答案 0 :(得分:1)

具有简单的递归功能:

def f: .name as $parent | .children[] | {$parent, displayName: .name}, f;
[ {name: "", children: .} | f ]

Online demo

答案 1 :(得分:1)

这是一个简单的解决方案,不涉及辅助函数,实际上解决了更一般的问题。它基于以下想法:首先为每个孩子添加一个“父”键,然后使用..来收集所有名称/父对。

所以首先考虑:

[ 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}
]

这满足要求,但顶级(无父)对象的.parent值为null。通常,它比“”更具JSON风格,但是如果确实需要空字符串,则只需将上面的最后一条不平凡的行替换为:

| {displayName: .name, parent: (.parent // "")}