2016-03-22 20 views
6

Konsul içindeki her bir derinlik düzeyi için iç içe bir nesne ile consult kv'den json'a veri aktarmaya çalışıyorum.İç içe yerleştirilmiş nesnelere bir dize ayırmak için jq kullanma

Örnek json konsülden döndürdü:

[ 
    { 
    "LockIndex": 0, 
    "Key": "foobar/testing", 
    "Flags": 0, 
    "Value": "xxxxx", 
    "CreateIndex": 833, 
    "ModifyIndex": 833 
    }, 
    { 
    "LockIndex": 0, 
    "Key": "foobar/bazbar", 
    "Flags": 0, 
    "Value": "xxxxx", 
    "CreateIndex": 833, 
    "ModifyIndex": 833 
    } 
] 

İstenilen JSON:

[ 
    { 
    "foobar": { 
     "testing": "xxxxx", 
     "bazbar": "xxxxx" 
    } 
    } 
] 

Ben yakın jq '.[] | objects | {Key: .Key | split("/"), Value: .Value}' ile sayılırım ama sadece bir bölüme dayanan RECURSE nasıl anlayamıyorum() .Key ve yuvalanmış nesneler oluşturun. Ayrıca, | add'u isteğe bağlı olarak yapamaması ve jq yapısını çözmemesi durumunda sıralama verilerinin işlenmesi için sort_by (.Key) 'a ihtiyacım olacağını düşünüyorum.

xxxxx'un base64 kodlu olduğunu ve umarım base64d'un yakında birleştirileceğini umuyorum ama o zamana kadar bunu kabuk post-processing ile çözmeyi başarabileceğimi düşünüyorum.

cevap

6

şu Verdiğiniz özel durumda ilgilenilen JSON nesnesi üretir, aynı zamanda birden fazla "filanca" öneki vardır durumunda makul genelleme sağlamaktadır:

map(. as $o | .Key | split("/") | {(.[0]): {(.[1]): ($o|.Value) }}) 
| reduce .[] as $o 
    ({}; 
     ($o|keys[0]) as $key | . + { ($key): (.[$key] + $o[$key]) }) 

Çıktı:

{ 
    "foobar": { 
    "testing": "xxxxx", 
    "bazbar": "xxxxx" 
    } 
} 
İşte
0

azaltmak kullanan bir çözümdür, ve setpath bölünmüş

[ 
    reduce (.[] | [(.Key | split("/")), .Value]) as [$p,$v] (
    {} 
    ; setpath($p; $v) 
) 
] 
İlgili konular