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

如何使用jq命令向JSON文件的vm_map映射追加新条目

jq向JSON对象追加键值对实现方法

需求背景

需要通过jq命令操作JSON文件,向文件中已存在的vm_map空对象内,按键名(如vm1、vm2)追加对应的映射条目,支持每次执行命令新增单条或多条记录,不覆盖原有已存在的条目。

初始文件内容(new_json.json)

{
  "gcs_config": [
    {
      "bucket_name": "somebucket",
      "bucket_readers": [],
      "bucket_writers": []
    }
  ],
  "label_application": "someapp",
  "label_environment": "dev",
  "lits_vm_zone": "somezone",
  "project_id": "someproject",
  "region": "someregion",
  "storage_bucket_required": true,
  "vm_map" : {}
}

预期最终效果

{
  "gcs_config": [
    {
      "bucket_name": "somebucket",
      "bucket_readers": [],
      "bucket_writers": []
    }
  ],
  "label_application": "someapp",
  "label_environment": "dev",
  "lits_vm_zone": "zone-a",
  "project_id": "someproject",
  "region": "someregion",
  "storage_bucket_required": true,
  "vm_map": {
    "vm1": {
      "host": "vm1",
      "network": "10.1.1.1",
      "name": "vm1"
    },
    "vm2": {
      "host": "123",
      "network": "10.1.12",
      "name": "vm2"
    }
  }
}

具体实现命令

追加单个条目

通过--arg传入字符串类型的键名,--argjson传入JSON格式的条目值,直接为vm_map下对应键赋值即可,不会影响原有已存在的其他键:

# 追加vm1条目,兼容所有jq版本,通过临时文件写入
jq --arg key "vm1" \
  --argjson value '{"host":"vm1","network":"10.1.1.1","name":"vm1"}' \
  '.vm_map[$key] = $value' new_json.json > tmp.json && mv tmp.json new_json.json

批量追加多个条目

如果需要一次新增多个条目,使用jq的对象合并运算符*,将原有vm_map和新条目对象合并即可:

# 一次追加vm1、vm2两个条目
jq --argjson new_entries '{
  "vm1": {"host": "vm1", "network": "10.1.1.1", "name": "vm1"},
  "vm2": {"host": "123", "network": "10.1.12", "name": "vm2"}
}' '.vm_map = .vm_map * $new_entries' new_json.json > tmp.json && mv tmp.json new_json.json

合并规则说明:写法.vm_map * $new_entries中,如果出现重名键,新传入的条目会覆盖旧值;如果需要保留旧值、不覆盖已有同键内容,将合并顺序调整为$new_entries * .vm_map即可。

原地修改简化写法

如果你的jq版本为1.6及以上,可以使用-i参数直接原地修改文件,不需要手动创建临时文件:

# 单条目追加原地修改版
jq -i --arg key "vm1" \
  --argjson value '{"host":"vm1","network":"10.1.1.1","name":"vm1"}' \
  '.vm_map[$key] = $value' new_json.json

# 多条目批量追加原地修改版
jq -i --argjson new_entries '{"vm2": {"host": "123", "network": "10.1.12", "name": "vm2"}}' \
  '.vm_map = .vm_map * $new_entries' new_json.json

注意事项

  • 传入JSON格式的参数必须使用--argjson,如果误用--arg,传入的内容会被识别为字符串,破坏JSON结构
  • 不推荐使用+=做对象拼接,低版本jq对对象的+=操作存在兼容问题,使用*运算符做对象合并的兼容性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:36:19