2014-12-19 7 views
6

Biorąc pod uwagę następujące xample.json;jq: zagnieżdżony obiekt, wypakuj identyfikator najwyższego poziomu i podnieś wartość z wewnętrznego obiektu

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

mogę wyodrębnić id i votes łatwo:

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

Ale co by kwerenda wyglądać wyodrębnić id i stuff.info-spec? Oczywistą (do mnie) składnia nie działa w ogóle:

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

Próbowałem stuff[info-spec] i stuff["info-spec"] jak dobrze, ale cóż, ja po prostu nie wydaje się mieć żadnego pojęcia, jak to powinno być zrobione.

Myślnik w nazwie klucza wydaje się komplikować sprawy jeszcze bardziej, ale moje ograniczone zrozumienie jest takie, że mogę obejść to z podwójnymi cytatami.

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

podaje oczekiwany wynik (tj. Podobnie jak powyżej bez kreski w "vo-tes").

można wyodrębnić book:

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

ale znowu nie może dowiedzieć się, składnię id i book; ale również, że nie można wyodrębnić info-spec z tej samej składni:

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

Gdybym wyjąć cytaty, komunikat o błędzie jest (przewidywalnie) inna:

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

Ale hej, to działa:

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

My sygnał wyjściowy w tym przykładzie, a następnie,

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

Spojrzałem na FAQ i jq Cookbook, ale nie mogę znaleźć nic na temat składni do "podnoszenia" przedmiotu z wewnątrz obiektu wewnątrz innego obiektu.

Odpowiedz

1

Udało mi się to rozgryźć.

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

Kluczem wydaje się być użycie zapisu newkey: .complex["key"] do podnoszenia.

4

ciekawe, problem jest w istocie - charakter i to działa na mnie „”:

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

jeszcze swoją jq wydaje się nie podoba, że ​​składnię jak złamał się na następujących i kopalnia nie:

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

używam:

jq --version 
jq-1.4 

edit: wygląda na problem z wersja < 1.4 Rzeczywiście: https://github.com/stedolan/jq/issues/38

+0

Ciągle mam 1.2. – tripleee

+1

tak, właśnie edytowane z tym: https://github.com/stedolan/jq/issues/38 –

Powiązane problemy