【问题标题】:jq parsing get value [closed]jq解析获取值
【发布时间】:2015-04-01 10:57:06
【问题描述】:

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

有人知道吗?

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

【问题讨论】:

  • 你卡在哪里了? jq 有手册、教程、...
  • 当你使用 jq .devices 之类的东西时,你只能得到 : 之后的值,而不是像 dimmer1 或 state 这样的值的“名称”
  • 解析 thisJSON 时,您将拥有一个基于解析器的多维数组或对象。您想要的值(dimmer1dimmer2)是键而不是值,因此它们识别您的值而不是值本身,它们是 。您也可以遍历数组并请求键,但无法准确检索数组的键。

标签: json linux jq


【解决方案1】:

编辑:在 cmets 中澄清后,要检索密钥以“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")),选择key以dimmer开头的设备
  • .value = .value.state 重组了描述设备的键值对,以便将值替换为其 state 属性
  • [ all that ] 制作了一个 JSON 数组,并且
  • [ all that ] | from_entries 将键值对数组转换回 JSON 对象。

旧答案(缩短),现已过时但可能会引起人们的兴趣:

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

jq '.devices | keys' filename.json

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

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

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

【讨论】:

  • 我认为它有帮助,但它只会让它变得更难。我需要从以 dimmer* 开头的设备中获取所有状态,例如 dimmer1、on dimmer2、off
  • 您知道,如果这是您想要实现的目标,您可以在问题中提到这一点。事实上,您应该编辑问题以明确这就是您想要的。无论如何,请参阅编辑。
猜你喜欢
  • 2019-06-11
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多