为什么jq中.a |= try sort无法正常工作?
问题原因解析
首先明确:正常情况下,.a |= try sort处理{"a": [3, 1, 2]}应该返回{"a": [1, 2, 3]},你遇到的输出{}是异常情况,核心原因大概率是以下两种:
1. Shell命令行的过滤器引用错误
如果你在终端执行jq时,没有给过滤器加上引号,比如:
jq .a |= try sort input.json
Shell会把|当成管道符拆分命令,实际执行的不是你预期的过滤器逻辑,而是错误的拆分操作,最终可能输出空对象。正确的写法必须用引号包裹整个过滤器:
jq '.a |= try sort' input.json
2. jq版本差异导致的try行为异常
在jq 1.5及更早版本中,try E等价于try E catch empty(而非1.6+版本的catch null)。如果sort因为某些原因抛出错误(比如数组里混了不可排序的类型,比如数字和字符串),try会返回empty,而.a |= empty会直接删除.a字段,原本只有.a的对象就变成了空对象{}。但你的输入是纯数字数组,sort本不该报错,所以这种情况可能是你测试时的输入有误,或者版本兼容问题。
另外补充:你提到处理{"b": 0}时“正常”,但实际上.a |= try sort会给这个对象新增"a": null字段(1.6+版本),如果你的输出没有这个字段,说明你可能误写了过滤器,比如用了条件更新运算符|=?(仅当字段存在时才更新)而非|=。
内容的提问来源于stack exchange,提问作者Vasiliy Faronov
相关产品推荐
相关产品推荐

