JQ цикл через строку JSON. JQ: ошибка (в: 9): не может индексировать массив со строкой "ID" - PullRequest
3 голосов
/ 20 мая 2019

Я пытаюсь перебрать все элементы, содержащиеся в индексе all.Вот моя строка json:

{  
   "all":[  
      {  
            "id":"51a"
      },
      {  
            "id":"52b"
      },
      {  
            "id":"53c"
      }
    ]
}

Я пытался выполнить итерацию с jq:

for id in $(jq '.all.id | keys | .[]' <<< "$json"); do
    echo "$id"
done

Но я получаю следующую ошибку:

jq: error (at: 9): невозможно индексировать массив с помощью строки «id»

Я ожидаю получить следующий вывод:

51a
52b
53c

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Вот так:

for id in $(jq -r '.all[].id' <<< "$json"); do
    echo "$id"
done

Обратите внимание, что параметр -r необходимо использовать, если вы хотите удалить двойные кавычки:

 ·   --raw-output / -r:

       With this option, if the filter´s result is a string then
       it will be written directly to standard output rather than
       being formatted as a JSON string with quotes. This can be
       useful for making jq filters talk to non-JSON-based
       systems.

ВесьСценарий может выглядеть следующим образом:

#!/usr/bin/env bash

json='{  
   "all":[  
      {  
            "id":"51a"
      },
      {  
            "id":"52b"
      },
      {  
            "id":"53c"
      }
    ]
}'

for id in $(jq -r '.all[].id' <<< "$json"); do
    echo "$id"
done

Но, как отмечено в комментариях, for x in $(...) является антипаттерном и не должен использоваться: https://mywiki.wooledge.org/DontReadLinesWithFor.

Чтобы назначить два индекса двум отдельнымпеременные:

#!/usr/bin/env bash

json='{
   "all":[
      {
            "id":"51a",
            "name":"Steve"
      },
      {
            "id":"52b",
            "name":"Phoebe"
      },
      {
            "id":"53c",
            "name":"Dino"
      }
    ]
}'

jq -r '.all[] | .id + " " + .name' <<< "$json" |
    while read -r id name; do
        echo id: "$id"
        echo name: "$name"
    done
1 голос
/ 20 мая 2019

и вот альтернативное решение, основанное на Unix-инструменте Walk-Path для JSON: jtc:

bash $ for id in $(jtc -qq -w'[all][:][id]' <<< "$json"); do  echo "$id"; done
51a
52b
53c
bash $ 

PS> Раскрытие информации: я создатель инструмента jtc

...