Confundido sobre jq parser

4

Estoy tratando de usar jq parser en mis scripts de bash y estoy confundido acerca de cómo funciona, ¿alguien podría explicar qué estoy haciendo mal?

Aquí está el archivo original del servicio externo y necesito obtenerlo value:

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

Intentando enviarlo a jq:

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

Tratando de obtener sensors:

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

Intentando llegar valuedesde sensors:

root@test ~ # cat narod.json | jq '.sensors.value'
jq: error (at <stdin>:0): Cannot index array with string "value"
SimWhite
fuente
jq sensors[].valueNo intente en mi computadora, así que no puedo probar ni publicar una respuesta completa, pero lo haré más tarde
Phil
¡Funciona! Muchas gracias y ¿podrías explicarme o darme un enlace donde me equivoqué?
SimWhite
1
.sensorsen su entrada JSON hay una matriz , no un dict. No tiene índices como .value, solo sus elementos internos. Por lo tanto, debe decirle a jq que aplique el índice a cada elemento de la matriz usando[]
grawity

Respuestas:

5

Como se discutió en los comentarios, en este caso específico debe usar:

jq sensors[].value

Esto se debe a que debe indicar jqque espere una matriz (indicada por [ ]). Efectivamente esto está diciendo, 'busca en el siguiente nivel hacia abajo en la jerarquía'.

En general, cuando encuentre una matriz ( [) en su archivo json, debe proporcionar esto en su consulta: jq array_name[].object_in_arraydevolvería el contenido de object_in_array.

Phil
fuente
1

Algo a tener en cuenta al trabajar con matrices en jq es que el operador [] enumerará cada uno de los valores de la matriz, por lo que

 .sensors[].value

devuelve el .valuede todos los objetos en .sensors. Es equivalente al filtro

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

si desea .valueun objeto en particular, a menudo querrá incluir una selección . p.ej

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