jq中操作--argjson参数报错,寻求解决方法
问题原因
--argjson传入的$options是不可变的常量,而+=是jq的路径赋值操作,仅能作用于可修改的JSON节点(比如.开头的内部路径),不能直接用于外部传入的$前缀变量,这就是你收到"Invalid path expression"错误的核心原因。
修复与解决方案
1. 直接修复报错命令
如果只是需要合并数组,不需要修改原变量,可以直接用数组相加操作:
jq -c --null-input --argjson options '[ { "a": "b" } ]' '$options + [ { "c": "d" } ]'
输出:
[{"a":"b"},{"c":"d"}]
或者先把常量变量存入可修改的临时节点,再用+=操作:
jq -c --null-input --argjson options '[ { "a": "b" } ]' '{temp: $options} | .temp += [{"c":"d"}] | .temp'
2. 递归场景的适配方案
针对你提到的跨函数递归收集对象需求,推荐通过函数参数传递累积结果,或者使用reduce进行迭代累积,避免依赖修改外部变量:
示例:递归遍历JSON并收集目标对象
jq -c --null-input --argjson data '{"level1": {"a": {"value":1}}, "level2": {"b": {"value":2}}, "level3": {"c": {"value":3}}}' ' # 定义递归函数:参数1为累积结果数组,参数2为当前遍历节点 def collect_targets($acc; $node): # 如果当前节点是对象,且包含value字段,加入累积数组 if $node | type == "object" then local $new_acc = if $node | has("value") then $acc + [$node] else $acc end; # 遍历所有子节点,继续递归收集 reduce ($node | keys_unsorted[]) as $key ( $new_acc; collect_targets(.; $node[$key]) ) else $acc # 非对象节点直接返回当前累积结果 end; # 初始调用:累积数组为空,从传入的$data开始遍历 collect_targets([]; $data) '
输出:
[{"value":1},{"value":2},{"value":3}]
这种方法通过函数参数传递更新后的累积数组,完全符合jq的函数式编程模型,也能满足跨函数递归收集的需求。
内容的提问来源于stack exchange,提问作者JdeHaan
相关产品推荐
相关产品推荐

