使用 jq 专门处理空的 JSON 数组

问题描述

我希望第一个命令以状态 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

解决方法

[这是对原始问题的回应,其中 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}]}
,

要特别处理 .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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...