![当数组有时不存在时,如何使用 jq 解析 JSON 文档?](https://linux22.com/image/229593/%E5%BD%93%E6%95%B0%E7%BB%84%E6%9C%89%E6%97%B6%E4%B8%8D%E5%AD%98%E5%9C%A8%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20jq%20%E8%A7%A3%E6%9E%90%20JSON%20%E6%96%87%E6%A1%A3%EF%BC%9F.png)
我有一个实用程序,可以为我提供具有不同结构的 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 时迭代数组的元素 statutes
,total
则会收到错误:
$ utility | jq '.statuses.[]'
jq: error (at <stdin>:4): Cannot iterate over null (null)
当输入中缺少数组时,如何避免此错误?
答案1
要迭代statuses
数组,.statuses[]?
如果您认为它有时可能不存在,请使用。该表达式.statuses[]?
相当于.statuses | .[]?
,即,它提取statuses
值,如果它是有效数组,则继续从中生成一组数组元素。
例如,以下表达式将为您提供一个包含数组中所有值jq
的 JSON 数组,如果该数组不存在,则为您提供一个空数组:desc
statuses
statuses
[.statuses[]?.desc]
也可以看看 ”.[]?“ 和 ”可选对象标识符索引:.foo?“在jq
手册中。