对 jq 解析器感到困惑

对 jq 解析器感到困惑

我正在尝试使用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"

答案1

正如评论中所讨论的,在这种特定情况下,您应该使用:

jq sensors[].value

这是因为您需要告知jq期望一个数组(用 表示[ ])。实际上,这表示“在层次结构的下一级进行搜索”。

一般来说,当您[在 json 文件中遇到数组()时,您应该在查询中提供它:jq array_name[].object_in_array将返回的内容object_in_array

答案2

使用数组时需要注意的事项杰奇[]运算符将枚举数组的每个值,因此

 .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

相关内容