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

Linux下如何用含变量的字典替换JSON中的数组字典

批量替换JSON数组时含变量的正确实现方法

问题场景

已能通过纯文本替换JSON文件中的数组:
原sample.json内容:

{ 
  "persons": [ 
    { 
      "name": "test1", 
      "age": 20 

    }, 
    { 
      "name": "test2", 
      "age": 21 
    } 
  ] 
}

纯文本替换命令:

DATA='[{"name": "tony", "age": 22}]'   
jq --argjson newdata "$DATA" '.persons[0] = $newdata' sample.json > tmp && mv tmp sample.json

但当替换内容包含shell变量时,执行以下命令会报错:

NAME="namevar"
DATA="[{"name": "$NAME", "age": 22}]" 
jq --argjson newdata "$DATA" '.persons = $newdata' sample.json > tmp && mv tmp sample.json

错误提示:

jq: invalid JSON text passed to --argjson
Use jq --help for help with command-line options,
or see the jq manpage, or online docs  at https://stedolan.github.io/jq

期望替换后sample.json内容:

{ 
  "persons": [ 
    { 
      "name": "namevar", 
      "age": 20 
    }
  ] 
}

错误原因

原命令中DATA的定义存在两个问题:

  1. 外层用双引号包裹JSON字符串,内部的双引号会被shell解析,直接破坏JSON结构;
  2. 变量$NAME替换后,生成的字符串未被引号包裹,导致最终传递给--argjson的内容不是合法JSON。

正确解决方案

方法一:用jq的--arg传递变量(推荐)

无需手动拼接JSON字符串,直接通过--arg将shell变量传入jq,在jq表达式中构建目标数组:

NAME="namevar"
jq --arg newname "$NAME" '.persons = [{"name": $newname, "age": 20}]' sample.json > tmp && mv tmp sample.json

这种方式由jq自动处理JSON格式,从根源避免拼接错误。

方法二:正确拼接JSON字符串

如果需要先构造完整的JSON字符串,需对引号进行转义或采用正确的拼接方式:

NAME="namevar"
# 用单引号包裹JSON固定部分,变量部分单独拼接
DATA='[{"name": "'"$NAME"'", "age": 20}]'
jq --argjson newdata "$DATA" '.persons = $newdata' sample.json > tmp && mv tmp sample.json

通过单引号+双引号的组合,确保变量替换后生成的是合法JSON。

批量替换多个JSON文件

如果需要处理目录下所有JSON文件,可结合shell循环实现:

NAME="namevar"
for json_file in *.json; do
  jq --arg newname "$NAME" '.persons = [{"name": $newname, "age": 20}]' "$json_file" > tmp && mv tmp "$json_file"
done

内容的提问来源于stack exchange,提问作者moluzhui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:51:15