You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:53:31