【问题标题】:Flatten a hierarchical JSON array using JQ使用 JQ 展平分层 JSON 数组
【发布时间】:2020-11-21 10:41:52
【问题描述】:

谁能帮我得到正确的 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"
    }
]

【问题讨论】:

    标签: arrays json jq flatten


    【解决方案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 // "")}
    

    【讨论】:

      【解决方案2】:

      用一个简单的递归函数:

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

      Online demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        相关资源
        最近更新 更多