json-rpc response jq filtering with multiple possible values

json-rpc response jq filtering with multiple possible values

不知道如何过滤 jq 输出以仅显示来自 json-rpc 响应的结果或错误消息。示例响应如下所示:

正常:

{
  "result": "0001",
  "id": 1,
  "jsonrpc": "2.0"
}

错误:

{
  "error": {
    "code": -32000,
    "message": "Server error",
    "data": {
      "type": "TypeError",
      "args": [
        "'NoneType' object is not subscriptable"
      ],
      "message": "'NoneType' object is not subscriptable"
    }
  },
  "id": 1,
  "jsonrpc": "2.0"
}

我可以单独访问它们,但不知道如何获得 'or' 功能

$ ./reqok | jq .result
"0001"
$ ./reqbad | jq .error.data.message
"'NoneType' object is not subscriptable"

jq 中,您可以使用可用于 return 默认值的备用运算符 //。例如。 a // b 形式的过滤器产生与 a 相同的结果,如果 a 产生 falsenull 以外的结果。否则,a // b 产生与 b.

相同的结果

对于提供默认值也很有用:如果输入中没有 .foo 元素,.foo // 1 将计算为 1

jq '.result? // .error.data.message?'

请注意,当 .result 的值不是 nullfalse 时,这将 起作用,在这种情况下执行进入替代条件。

在这两种情况下,结果都是 JSON 对象,因此您可以通过检查对象是否具有 "error" 键来避免使用 // 出现的 null/false 问题,沿着:

if has("error") then ... else ... end

当然这个方法也可以结合使用//?