我正尝试更新大型复杂的json文件,并在检测到不一致的数据(使用jq 1.6)时退出并显示详细的错误消息。
我开始使用函数并尝试/捕获以生成一种Java stacktrace,其中包含每个级别的输入数据=>简单,谢谢JQ
但是当我开始更新数组元素(使用| =)时,我没有找到解决方法
这是一个非常简单的示例:
echo '{"array": [{"foo":"bar"}]}' | jq -c '.array[] |= try . catch (.)'
output : {"array":[{"__jq":0}]}
我做错了吗?这是正常现象吗?
感谢您的帮助
答案 0 :(得分:0)
try-catch实际上不是一个表达式,它不产生任何有意义的值,它仅执行一些表达式:
可以使用try EXP catch EXP捕获错误。 第一个表达式被执行,如果第二个表达式失败,则执行第二个错误消息。处理程序的输出(如果有)被输出,就好像它是要尝试的表达式的输出一样。
强调我。
因此使用该值将是错误的,您应该在try表达式中执行赋值。
$ echo '{"array": [{"foo":"bar"}]}' | jq -c 'try (.array[] |= .) catch (.)'
答案 1 :(得分:0)
您偶然发现了jq 1.6中的错误。使用jq 1.5,可以获得正确的输出:
{"array":[{"foo":"bar"}]}
但是,实际上.array[] |= try . catch (.)
并不是一个表达式,因为如果.array是JSON数组或JSON对象,它只会说:什么也不做。
要了解try ... catch ...
,考虑以下示例可能会有所帮助:
$ jq -n 'try error("abc") catch ("The error message was " + .)'
"The error message was abc"