使用 jq 专门处理空 JSON 数组

Posted

技术标签:

【中文标题】使用 jq 专门处理空 JSON 数组【英文标题】:Handling empty JSON array specially with jq 【发布时间】:2021-06-12 13:23:58 【问题描述】:

我希望第一个命令以状态 0 退出而不打印任何内容。第二条命令的输出和状态应该如图所示。谁能告诉我如何修改jq_expr 来实现这一点? (应保留选项-e。)

$ jq_expr='.value | .[] | [.x] | @tsv'
$ jq -e -r "$jq_expr" <<< '"value": []' || echo "$?" # I just want this one to exit with 0 instead of 4.
4
$ jq -e -r "$jq_expr" <<< '"value": ["x":42]' || echo "$?"
42

【问题讨论】:

对不起。我犯了一个错误。我已经修复了错误。 $? 是退出状态。我想确保退出状态始终为 0。它不是输出的一部分。我从来没有改变过标题。你改了吗?我找不到标题的原始版本。能否将标题改回原来的标题? 【参考方案1】:

[这是对原始问题的回应,其中 jq 的第一次调用被赋予了准 JSON 值:"value": [x:1]。]

表达式 "value": [x:1] 不是有效的 JSON,因此如果它被视为有效的 JSON,则抑制错误消息的唯一方法是将其重定向到 /dev/null。 (jq的异常处理机制不能用来捕捉这种语法错误。)

有多种工具(包括 jq 本身)可用于将此类准 JSON 字符串转换为 JSON,因此您可能想利用其中一种工具。例如,考虑:

$ jq -nc -f <(echo '"value": [x:1]')
"value":["x":1]

【讨论】:

【参考方案2】:

要特别处理 .value 是空数组的情况,您可以使用 if ... then ... else ... end 语句、try ... catch ... 表达式或类似的表达式。

由于要求不太清楚,我只是指出您可以放弃 -e 要求并使用:

jq_expr='.value | if length > 0 then map(.x) else empty end | @tsv'

如果您真的想使用 -e 选项,您可能必须根据您最近关于 SO 的问题之一使用 halt_error/1

【讨论】:

$ jq -e -r '.value | if length &gt;0 then .[].x else empty end | @tsv' &lt;&lt;&lt; '"value": []' || echo "$?" 4 $ jq -e -r '.value | if length &gt;0 then .[].x else empty end | @tsv' &lt;&lt;&lt; '"value": ["x":42]' || echo "$?" jq: error (at &lt;stdin&gt;:1): number (42) cannot be tsv-formatted, only array 5 这不起作用。要求是这两个命令应该按原样打印输出,除了返回状态都应该是 0。你能检查如何修改 jq_expr 使其工作吗? 查看更新。 -e 要求只会让事情变得不必要地复杂化,所以我将把它留给你。 $ jq -e -r '.value | if length &gt; 0 then map(.x) else empty end | @tsv' &lt;&lt;&lt; '"value": []' || echo "$?" 4 退出状态还是4。哪个语句导致它返回错误退出状态?启用-e后没有办法抑制吗? 我已经说过,如果你坚持使用错误的选项,你可以尝试使用halt_error。

以上是关于使用 jq 专门处理空 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

jq点击按钮添加元素到数组

使用 struct 在 Go 中处理空 JSON 数组

使用 jq 向现有 JSON 数组添加新元素

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

使用 jq 从多维 JSON 数组中选择第 n 个元素

使用 JQ 展平分层 JSON 数组