jq解析获取值

use*_*696 10 linux json jq

我需要从json文件中获取一些值.我需要一个阵列(dimmer1,dimmer2)

有人有什么想法吗?

{
 "devices": {
    "dimmer1": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    },
    "dimmer2": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

Win*_*ute 24

编辑:在评论中澄清后,要检索键"以"调光器"开头的设备的状态,请使用

jq '[ .devices | to_entries[] | select(.key | startswith("dimmer")) | .value = .value.state ] | from_entries' filename.json
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "dimmer1": "off",
  "dimmer2": "off"
}
Run Code Online (Sandbox Code Playgroud)

其工作原理如下:

  • .devices选择.devicesJSON对象的属性
  • to_entries将对象分解为描述其属性(设备)的键值对数组,也就是说属性"foo": "bar"成为对象{ "key": "foo", "value": "bar" },并将展开的对象扩展为此类对象的数组(每个属性一个)
  • to_entries[] 解压缩该数组,以便通过它
  • select(.key | startswith("dimmer")),选择那些键开头的设备 dimmer
  • .value = .value.state重新构造描述设备的键值对,以便仅使用其state属性替换该值
  • [ all that ] 制作所有这些的JSON数组,和
  • [ all that ] | from_entries 将键值对数组转换回JSON对象.

旧答案(缩短),现已过时但可能有意义:

要检索devices数组中属性的键:

jq '.devices | keys' filename.json
Run Code Online (Sandbox Code Playgroud)

要检索值(也在数组中),

jq '[ .devices[] ]' filename.json
Run Code Online (Sandbox Code Playgroud)

我不完全确定你指的是哪两个.

  • 你知道,如果这就是你想要实现的目标,你可以在问题中提到这一点。事实上,您应该编辑问题以明确这就是您想要的。无论如何,请参阅编辑。 (2认同)