繁体   English   中英

使用 JQ 展平分层 JSON 数组

[英]Flatten a hierarchical JSON array using JQ

谁能帮我获得正确的 jq 命令来展平下面的示例? 我看过其他一些帖子,我正在破解它,但似乎无法得到它。 我将不胜感激任何帮助。

输入:

[
    {
        "name": "level1",
        "children": [
            {
                "name": "level2",
                "children": [
                    {
                        "name": "level3-1",
                        "children": []
                    },
                    {
                        "name": "level3-2",
                        "children": []
                    }
                ]
            }
        ]
    }
]

Output:

[
    {
        "displayName": "level1",
        "parent": ""
    },
    {
        "displayName": "level2",
        "parent": "level1"
    },
    {
        "displayName": "level3-1",
        "parent": "level2"
    },
    {
        "displayName": "level3-2",
        "parent": "level2"
    }
]

使用简单的递归 function:

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

在线演示

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

所以首先考虑:

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

除了顶级(无父) object 之外,这符合要求,它产生的 a.parent 值为null 这通常比“”更具有 JSON 风格,但如果确实需要空字符串,则只需将上面的最后一行替换为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM