簡體   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