2017-03-09 4 views
2

私は、ツリースタイルのJSONオブジェクト内のすべての分岐を追跡して、各分岐から1つの長い連結文字列を作成しようとしています。子の数とノードあたりの最大深さは不明なので、結果は任意の量に一般化する必要があります。可変深度の入れ子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でチャンスを掴みます。

これは、子供が1人しかいない素朴なケースで動作することがわかります。私が最も混乱しているところは、複数の子供のシナリオで親を "リセット"する方法です。代わりに
root -> foo -> bar -> baz
を再帰の私は上記jqplayから
root -> foo -> bar
root -> foo -> baz

所望の出力たいと思います:私は純粋なJQソリューションを好むだろう
"root/foo/bar" "root/foo/baz" "root/zoo/zar/zaz"

を、一般的なbashのソリューションも希望作業。

+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 
関連する問題