Confuso sobre o parser jq

3

Estou tentando usar analisador jq em meus scripts bash e estou confuso sobre como isso funciona, alguém poderia explique o que estou fazendo errado?

Aqui está o arquivo original do serviço externo e eu preciso obter value dele:

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

Tentando enviá-lo para jq :

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

Tentando obter sensors :

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

Tentando obter value de sensors :

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

2 respostas

2

Como discutido nos comentários, neste caso específico, você deve usar:

jq sensors[].value

Isso porque você precisa informar jq para esperar uma matriz (indicada por [ ] ). Efetivamente, isso está dizendo, 'busque no próximo nível abaixo na hierarquia'.

Em geral, quando você encontrar uma matriz ( [ ) no seu arquivo json, você deve fornecer isso em sua consulta: jq array_name[].object_in_array retornaria o conteúdo de object_in_array .

    
por 04.03.2016 / 15:06
1

Algo que você deve ter em mente ao trabalhar com matrizes em jq é que o [] operador irá enumerar cada um dos valores da matriz, então

 .sensors[].value

retorna o .value de todos os objetos em .sensors . É equivalente ao filtro

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

Se você quiser o .value de um objeto em particular, muitas vezes você vai querer incluir um selecione . por exemplo.

 .sensors[] | select(.id == 34585) | .value
    
por 06.09.2017 / 21:52