使用try catch更新数组元素

时间:2019-02-25 21:14:51

标签: jq

我正尝试更新大型复杂的json文件,并在检测到不一致的数据(使用jq 1.6)时退出并显示详细的错误消息。

我开始使用函数并尝试/捕获以生成一种Java stacktrace,其中包含每个级别的输入数据=>简单,谢谢JQ

但是当我开始更新数组元素(使用| =)时,我没有找到解决方法

这是一个非常简单的示例:

echo '{"array": [{"foo":"bar"}]}' | jq -c '.array[] |= try . catch (.)'
output : {"array":[{"__jq":0}]}

我做错了吗?这是正常现象吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

try-catch实际上不是一个表达式,它不产生任何有意义的值,它仅执行一些表达式:

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"