使用此示例:

{
  "node1": {
    "name": "host001",
    "free": true
  },
  "node2": {
    "name": "host002",
    "free": false
  },
  "node3": {
    "name": "host003",
    "free": false
  },
  "node4": {
    "name": "host004",
    "free": true
  }
}

我可以使用以下命令检索"Free"=true的 node 名:

.[]|select(.free == true).name

https://jqplay.org/s/vmQFs8KYF2Q

但是我的JSON有一些没有这个"自由"键的元素:

{
  "id": "foo",
  "node1": {
    "name": "host001",
    "free": true
  },
  "node2": {
    "name": "host002",
    "free": false
  },
  "node3": {
    "name": "host003",
    "free": false
  },
  "node4": {
    "name": "host004",
    "free": true
  }
}

然后我的命令失败,错误为parse error: Invalid numeric literal at line 2, column 4

我认为解决方法在于"Has(Free)",但找不到正确的语法.

推荐答案

您可以在.free上使用error suppression operator ?:

.[]|select(.free? == true).name

Demo

或者,您可以使用type判断上下文是否为对象:

.[]|select(type == "object" and .free == true).name

Demo

注意:在这两种情况下,您也可以将.free == true减少到.free,因为==的计算结果也是布尔值.

Json相关问答推荐

使用JSONata将具有相同键的字典合并

Jolt Transformation—如果子对象为空,则将父对象更新为空

如何使用JQ有条件 Select 值

在解码的JSON哈希中搜索数组元素

无法访问id的第三级json

NoneType 对象的 Python 类型错误

如何将一个对象添加到多个对象中 JOLT

如何使用 serde_json 构建有状态的流式解析器?

Shell脚本空格转义

使用 jq 和 awk 拆分大型 JSON 文件

PowerShell:如何将哈希表输出为 json 并使用 foreach 循环将其存储在变量中?

jq搜索特定字符串并输出对应的父值

JSON 模式实际用于什么目的?

为什么我不能在 C# 中引用 System.Runtime.Serialization.Json

如何在 json 编码字符串内的子数组数据周围添加方括号?

我可以使用空字符串作为对象标识符吗?

如何在 Python 中合并两个 json 字符串?

JSON JQ 如果没有 else

如何在 Java 中将 YAML 转换为 JSON?

使用 JSON.NET 序列化/反序列化对象字典