Jq解析获取值

32

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

有人有什么想法吗?

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

你卡在哪个地方了?jq有手册、教程,... - T.J. Crowder
当您使用类似jq .devices的语法时,您只能获取冒号后面的数值,而不能获取该数值对应的名称,例如 dimmer1 或 state。 - user3467696
当你解析这个JSON时,根据解析器,你将得到一个多维数组或对象。你想要的值(dimmer1, dimmer2)是键而不是值,因此它们标识了你的值而不是值本身,它们是。你可以遍历数组并请求键,但没有办法准确地检索数组的键。 - Fabian de Pabian
1个回答

47

编辑:在评论中澄清后,要获取键以“dimmer”开头的设备状态,请使用以下方法

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

输出:

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

以下是其工作原理:

  • .devices 选取 JSON 对象的 .devices 属性
  • 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 对象。
jq '.devices | keys' filename.json

为检索值(也是数组),

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

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


我原以为它会有所帮助,但实际上只是让事情变得更加困难了。我需要获取所有以dimmer*开头的设备的状态,就像这样:dimmer1,打开 dimmer2,关闭 - user3467696
2
你知道吗,如果这是你想要实现的,你本可以在问题中提到。事实上,你应该编辑问题,以明确这是你想要的。无论如何,请查看编辑后的内容。 - Wintermute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接