2016-03-22 19 views
6

Sto cercando di esportare dati da console kv in json con un oggetto nidificato per ogni livello di profondità in console.Utilizzo di jq per dividere una stringa in oggetti nidificati

Esempio JSON restituito da console:

[ 
    { 
    "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 
    } 
] 

JSON desiderata:

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

Sono una specie di chiudere con jq '.[] | objects | {Key: .Key | split("/"), Value: .Value}' ma non sto solo capire come posso Recurse sulla base di una scissione() di .Key e crea oggetti nidificati. Penso che dovrò anche ordinare sort_by (.Key) per gestire i dati fuori ordine, a meno che non sia possibile arbitrare lo | add e jq risolvere la struttura.

Mi rendo conto che xxxxx è codificato in base64 e, si spera, base64d verrà unito rapidamente ma fino ad allora penso di poter gestire la decodifica con la post-elaborazione della shell.

risposta

6

Il seguente produce l'oggetto JSON di interesse nel caso particolare si dà, ma fornisce anche una generalizzazione ragionevole nel caso ci sia più di un "foobar" prefisso:

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

uscita:

{ 
    "foobar": { 
    "testing": "xxxxx", 
    "bazbar": "xxxxx" 
    } 
} 
0

Ecco una soluzione che utilizza ridurre, divisi e SetPath

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