2016-10-25 4 views
-1

Я получил строку JSON, как:как я могу использовать переменный в JQ (MacOS, оболочка)

{ 
    "id": 3397, 
    "title": "title_1" 
} 
{ 
    "id": 3396, 
    "title": "title_2" 
} 

, что я хочу сделать, это получить все id в цикле, я использую следующий код:

for ((i = 0; i < requestCount; i++)); do 
     requestId=$(echo $jsonString[$i] | jq '.id') 
     echo requestId; 
done 

, но он не работает, я думаю, что путь я использую переменную неправильно, я не могу найти ничего полезного здесь jq.

+1

Это не ясно, какая форма ввода у вас есть. Является ли 'jsonString' фактическим массивом оболочки, с одним элементом JSON на объект? 'jq' уже может выполнять итерацию самостоятельно, поэтому, если у вас есть правильный массив JSON, такой как' [{...}, {...}] ', вы просто используете что-то вроде' echo '$ json "| jq '.id''. – chepner

+0

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

ответ

1

Позвольте jq выполнить итерацию. (То есть, пусть JQ делать итерации через входной поток объектов JSON). Например:

$ jq .id <<< "$json" | while read id ; do echo "hello $id"; done 

Выход:

hello 3397 
hello 3396 

Таким образом, вы не должны знать, как много JSON объекты находятся на входе. Возможно, вы захотите использовать «read -r» или «IFS = read -r».

альтернатив уродливы и неэффективны, например .:

$ for ((i=0;i<2;i++)) ; do jq -s --argjson i "$i" '.[$i].id' <<< "$json" ; done 
+0

это сработало.i использовать это: echo $ requestJsonbyDate | jq '. []. id' | при чтении id; do \t echo "hello $ id"; сделано –

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