当数组有时不存在时,如何使用 jq 解析 JSON 文档?

当数组有时不存在时,如何使用 jq 解析 JSON 文档?

我有一个实用程序,可以为我提供具有不同结构的 JSON 数据。有时数组会丢失,有时则不会丢失。

例如,这是缺少数组的情况:

{
  "returned": 0,
  "total": 0
}

...这是包含数组的情况:

{
  "statuses": [
    {
      "Ident": "server:11ylb",
      "Ident2": "server:",
      "desc": "HOSE",
      "node": "servA"
    },
    {
      "Ident": "server:11yla",
      "Ident2": "server:",
      "numberOfRuns": 1,
      "desc": "CAR",
      "node": "servA"
    }
  ],
  "returned": 2,
  "total": 2
}

问题是,如果我尝试在 为 0 时迭代数组的元素 statutestotal则会收到错误:

$ utility | jq '.statuses.[]'
jq: error (at <stdin>:4): Cannot iterate over null (null)

当输入中缺少数组时,如何避免此错误?

答案1

要迭代statuses数组,.statuses[]?如果您认为它有时可能不存在,请使用。该表达式.statuses[]?相当于.statuses | .[]?,即,它提取statuses值,如果它是有效数组,则继续从中生成一组数组元素。

例如,以下表达式将为您提供一个包含数组中所有值jq的 JSON 数组,如果该数组不存在,则为您提供一个空数组:descstatusesstatuses

[.statuses[]?.desc]

也可以看看 ”.[]?“ 和 ”可选对象标识符索引:.foo?“在jq手册中。

相关内容