2014-12-19 7 views
6

Gegeben die folgenden xample.json;jq: verschachteltes Objekt, extrahiere ID der obersten Ebene und hebe einen Wert vom internen Objekt ab

[ 
{ 
    "id": 12345678, 
    "stuff": { "book": "shelf", "hook": "line", "took": "off", "info-spec": 12 }, 
    "votes": 23 
}, 
{ 
    "id": 12345679, 
    "stuff": { "book": "maker", "hook": "sinker", "took": "pisin", "info-spec": 23 }, 
    "votes": 1 
} 
] 

kann ich extrahieren die id und votes leicht:

$ jq '.[] | { id, votes }' xample.json 
{ 
    "votes": 23, 
    "id": 12345678 
} 
{ 
    "votes": 1, 
    "id": 12345679 
} 

Aber was würde die Abfrage aussehen wie id und stuff.info-spec zu extrahieren? Offensichtliche (für mich) Syntax funktioniert nicht überhaupt:

$ jq '.[] | { id, stuff.info-spec }' xample.json 
error: syntax error, unexpected '.', expecting '}' 
.[] | { id, stuff.info-spec } 
       ^
1 compile error 

Ich versuchte stuff[info-spec] und stuff["info-spec"] als gut, aber, na ja, ich habe nicht nur eine Ahnung zu haben scheinen, wie dies geschehen soll.

Der Strich im Schlüsselnamen scheint die Dinge noch komplizierter zu machen, aber mein begrenztes Verständnis ist, dass ich das mit doppelten Anführungszeichen umgehen kann.

$ sed 's/votes/vo-tes/g' xample.json | jq '.[] | { id, "vo-tes" }' 

gibt die erwartete Ausgabe (d. H. Ähnlich wie oben ohne den Bindestrich in "vo-tes").

Ich kann book extrahieren:

$ jq '.[] | .stuff.book' xample.json 

aber wieder nicht die Syntax für id und book herauszufinden; sondern auch, kann ich nicht info-spec mit der gleichen Syntax extrahieren:

$ jq '.[] | .stuff."info-spec"' xample.json 
error: syntax error, unexpected QQSTRING_START, expecting IDENT 
.[] | .stuff."info-spec" 
      ^
1 compile error 

Wenn ich die Zitate herausnehmen, ist die Fehlermeldung (vorhersagbar) anders:

$ jq '.[] | .stuff.info-spec' xample.json 
error: spec is not defined 
.[] | .stuff.info-spec 
        ^^^^ 
1 compile error 

Aber hey, das funktioniert:

$ jq '.[] | .stuff["info-spec"] ' xample.json 
12 
23 

My gewünschte Ausgabe für dieses Beispiel, dann ist

{ 
    "info-spec": 12, 
    "id": 12345678 
} 
{ 
    "info-spec": 23, 
    "id": 12345679 
} 

Ich habe mir die FAQ und die jq Cookbook angesehen, aber ich kann anscheinend nichts über eine Syntax zum "Heben" eines Gegenstandes innerhalb eines Gegenstandes in einem anderen Gegenstand finden.

Antwort

1

Ich schaffte es, es herauszufinden.

$ jq '.[] | { id, "info-spec": .stuff["info-spec"] }' xample.json 
{ 
    "info-spec": 12, 
    "id": 12345678 
} 
{ 
    "info-spec": 23, 
    "id": 12345679 
} 

Der Schlüssel hier scheint die newkey: .complex["key"] Notation für das Heben zu verwenden zu sein.

4

interessant ist die Frage in der Tat das Zeichen „-“ und das funktioniert für mich:

jq '.[] | { id, "info-spec": .stuff."info-spec" }' xample.json 
{ 
    "id": 12345678, 
    "info-spec": 12 
} 
{ 
    "id": 12345679, 
    "info-spec": 23 
} 

noch Ihre jq scheint nicht, dass die Syntax zu mögen, wie es auf der folgenden brach und meine nicht:

jq '.[] | .stuff."info-spec"' xample.json 
12 
23 

ich benutze:

jq --version 
jq-1.4 

edit: sieht aus wie eine Version Problem mit < 1.4 tatsächlich: https://github.com/stedolan/jq/issues/38

+0

Ich bin immer noch auf 1,2 scheint es. – tripleee

+1

yup, gerade bearbeitet mit diesem: https://github.com/stedolan/jq/issues/38 –

Verwandte Themen