2014-12-19 1 views
6

Учитывая следующее xample.json;jq: вложенный объект, извлекает идентификатор верхнего уровня и поднимает значение из внутреннего объекта

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

я могу извлечь id и votes легко:

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

Но что бы запрос выглядеть, чтобы извлечь id и stuff.info-spec? Очевидная (для меня) синтаксис не работает вообще:

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

Я попытался stuff[info-spec] и stuff["info-spec"] как хорошо, но, ну, я, кажется, не имеют ни малейшего представления, как это должно быть сделано.

Черта в ключевом ключе, похоже, еще более осложняет ситуацию, но мое ограниченное понимание заключается в том, что я могу обойти это с помощью двойных кавычек.

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

дает ожидаемый выход (т.

я могу извлечь book:

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

, но опять-таки не могу понять, синтаксис для id и book; но я не могу извлечь info-spec с тем же синтаксисом:

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

Если я вынимаю кавычки, то сообщение об ошибке (предсказуемо) различны:

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

Но эй, это работает:

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

Мой желаемый результат для этого примера, тогда,

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

Я посмотрел на FAQ и jq Cookbook, но я не могу найти ничего о синтаксисе для «подъема» предмета внутри объекта внутри другого объекта.

ответ

1

Мне удалось выяснить это.

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

Ключ здесь, как представляется, использовать newkey: .complex["key"] обозначения для подъема.

4

интересно, этот вопрос действительно «-» характер, и это работает для меня:

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

пока ваш jq, кажется, не нравится, что синтаксис как он сломал на следующий и не мое:

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

Я использую:

jq --version 
jq-1.4 

редактирования: выглядит как версия выпуска < 1.4 действительно: https://github.com/stedolan/jq/issues/38

+0

Я все еще на 1.2, кажется. – tripleee

+1

yup, только что отредактированный: https://github.com/stedolan/jq/issues/38 –

Смежные вопросы