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

如何用bash与jq为JSON文件添加JSON对象类型属性

解决JSON对象属性被转成字符串写入的问题

你的脚本核心问题是把JSON对象转成了字符串传递给jq,导致最终写入的是字符串而非原始JSON结构。以下是修复方案:

错误根源

  1. xargs会把jq输出的结构化JSON扁平化处理成无格式字符串,破坏了JSON结构
  2. 使用--arg传递参数时,jq会将其视为字符串类型,而非JSON对象

优化后的脚本

if [ ! -f "$src_file" ]; then
  echo "Source file $src_file does not exist"
  exit 1
fi
if [ ! -f "$dst_file" ]; then
  echo "Destination file $dst_file does not exist"
  exit 1
fi

# 校验源文件是否包含devDependencies键
if ! jq '.devDependencies' "$src_file" >/dev/null 2>&1; then
  echo "The key \"devDependencies\" does not exist in source file $src_file"
  exit 1
fi

# 直接读取源文件的devDependencies JSON对象,合并到目标文件
# 使用临时文件避免中途损坏原目标文件
jq --slurpfile src "$src_file" '. + {devDependencies: $src[0].devDependencies}' "$dst_file" > "$dst_file.tmp" && mv "$dst_file.tmp" "$dst_file"

echo "devDependencies已成功添加到目标文件"

关键改进点

  • 移除xargs,保留jq输出的原始JSON结构
  • 使用--slurpfile让jq直接加载源文件,避免额外的子shell调用和变量传递
  • 通过临时文件写入后替换的方式,防止目标文件因jq执行失败而损坏

如果需要动态指定键名(比如你的原脚本用$key变量),可以修改为:

key="devDependencies"
jq --slurpfile src "$src_file" --arg key "$key" '. + {($key): $src[0][$key]}' "$dst_file" > "$dst_file.tmp" && mv "$dst_file.tmp" "$dst_file"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:00:38