25

我需要从 json 文件中获取一些值。我需要一个数组(dimmer1,dimmer2)

有人知道吗?

{
 "devices": {
    "dimmer1": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    },
    "dimmer2": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    }
}
4

1 回答 1

40

编辑:在评论中澄清后,要检索密钥以“dimmer”开头的设备的状态,请使用

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

输出:

{
  "dimmer1": "off",
  "dimmer2": "off"
}

这工作如下:

  • .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

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

jq '[ .devices[] ]' filename.json

我不完全确定你指的是这两个中的哪一个。

于 2015-04-01T11:23:23.483 回答