2017-03-09 70 views
2

我試圖按照樹型JSON對象中的所有分支從每個分支創建一個長的連接字符串。孩子的數量和每個節點的最大深度是未知的,所以結果必須推廣到任何數量。從可變深度嵌套JSON值生成字符串

我正在使用的數據是類似以下內容:

{ 
    "name":"root", 
    "children": [ 
     { 
      "name":"foo", 
      "children":[ 
       { 
        "name":"bar", 
        "children":[] 
       }, 
       { 
        "name":"baz", 
        "children":[] 
       } 
      ] 
     }, 
     { 
      "name":"zoo", 
      "children": [ 
       { 
        "name":"zar", 
        "children": [ 
         { 
          "name":"zaz", 
          "children": [] 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

this jqplay example差點。

你可以在只有一個孩子的天真案例中看到這個作品。我最困惑的地方是如何在多個孩子的場景中「重置」父母。相反遞歸
root -> foo -> bar -> baz
的我想從上面的jqplay
root -> foo -> bar
root -> foo -> baz

所需的輸出:
"root/foo/bar" "root/foo/baz" "root/zoo/zar/zaz"

我希望能有一個純jq的解決方案,一般的解決方案猛砸也工作。

+0

*非常*漂亮問的問題! – hek2mgl

回答

0

由於你的數據結構是遞歸的,遞歸輔助函數是在這裏什麼需要:

def flat: 
    [.name] + (.children[] // {} | if has("name") then flat else [] end); 


flat | join("/") 

隨着你的輸入,使用jq -r輸出將是:

root/foo/bar 
root/foo/baz 
root/zoo/zar/zaz