使用 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 >0 then .[].x else empty end | @tsv' <<< '"value": []' || echo "$?" 4 $ jq -e -r '.value | if length >0 then .[].x else empty end | @tsv' <<< '"value": ["x":42]' || echo "$?" jq: error (at <stdin>:1): number (42) cannot be tsv-formatted, only array 5
这不起作用。要求是这两个命令应该按原样打印输出,除了返回状态都应该是 0。你能检查如何修改 jq_expr
使其工作吗?
查看更新。 -e 要求只会让事情变得不必要地复杂化,所以我将把它留给你。
$ jq -e -r '.value | if length > 0 then map(.x) else empty end | @tsv' <<< '"value": []' || echo "$?" 4
退出状态还是4。哪个语句导致它返回错误退出状态?启用-e
后没有办法抑制吗?
我已经说过,如果你坚持使用错误的选项,你可以尝试使用halt_error。以上是关于使用 jq 专门处理空 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章