3

Я пытаюсь использовать парсер jq в своих скриптах bash, и я не понимаю, как это работает, может кто-нибудь объяснить, что я делаю неправильно?

Вот исходный файл из внешнего сервиса, и мне нужно получить value из него:

root@test ~ # cat test.json 
{"sensors":[{"id":34585,"value":-3.06,"time":1457031003}]}

Пытаюсь отправить его на jq:

root@test ~ # cat narod.json | jq
{
  "sensors": [
    {
      "id": 34585,
      "value": -3.06,
      "time": 1457031003
    }
  ]
}

Попытка получить sensors:

root@test ~ # cat narod.json | jq '.sensors'
[
  {
    "id": 34585,
    "value": -3.06,
    "time": 1457031003
  }
]

Попытка получить value от sensors:

root@test ~ # cat narod.json | jq '.sensors.value'
jq: error (at <stdin>:0): Cannot index array with string "value"

2 ответа2

2

Как обсуждалось в комментариях, в этом конкретном случае вы должны использовать:

jq sensors[].value

Это потому, что вам нужно указать jq ожидать массива (обозначается как [ ]). По сути, это говорит: «поиск на следующем уровне вниз по иерархии.'

В общем, когда вы встречаете массив ([) в вашем json-файле, вы должны указать это в своем запросе: jq array_name[].object_in_array вернет содержимое object_in_array .

1

При работе с массивами в jq следует иметь в виду, что оператор [] будет перечислять каждое из значений массива, поэтому

 .sensors[].value

возвращает .value всех объектов в .sensors . Это эквивалентно фильтру

   .["sensors"]    # choose value of "sensors" key
 | .[]             # enumerate each value
 | .["value"]      # choose value of "value" key

Если вы хотите, чтобы .value для определенного объекта часто, вы захотите включить выбор. например

 .sensors[] | select(.id == 34585) | .value

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .