如何使用JQ更新JSON环境数组的release字段,不存在则创建条目
使用jq更新/添加JSON环境条目问题
理想的JSON结构
{ "environments":[ { "name":"test", "release":"2.0" }, { "name":"prod", "release":"1.0" } ] }
目标文件可能的状态
- 仅包含空对象
{ }的空文件 - 包含空的
"environments"数组,例如{"environments": []} "environments"数组已有部分条目,但无需要更新的环境
需求
针对指定环境,更新其release字段值;若该环境不存在,则创建对应的条目。
尝试过的命令
第一种命令:
(.environments[] | select(.name == "prod") | .release) = "3.0" // .environments += [{"name": "prod", "release": "3.0"}]
第二种命令:
.environments |= (map(.name) | index("prod")) as $ix | if $ix then .[$ix]["release"] = "2.0" else . + [{name: "release", value: "2.0"}] end
上述命令要么在处理空文件时失败,要么无法正确创建新条目。
解决方案
以下jq命令可处理所有场景(以更新prod环境的release为3.0为例):
简洁版命令
.environments = ( .environments // [] | (map(.name) | index("prod")) as $idx | if $idx then .[$idx].release = "3.0" else . + [{name: "prod", release: "3.0"}] end )
命令说明
.environments // []:处理空文件(此时.environments不存在)或已有空数组的情况,确保后续操作基于数组进行(map(.name) | index("prod")) as $idx:获取目标环境在数组中的索引,不存在则返回null- 条件判断:
- 若索引存在(环境已存在),则更新对应条目的
release值 - 若索引不存在,则向数组追加新的环境条目
- 若索引存在(环境已存在),则更新对应条目的
- 最终赋值给
.environments,确保生成正确的JSON结构
测试验证
- 空文件
{}执行后:生成{"environments": [{"name": "prod", "release": "3.0"}]} - 空数组
{"environments": []}执行后:结果同上 - 已有其他条目(如
{"environments": [{"name": "test", "release": "2.0"}]})执行后:添加prod条目 - 已有
prod条目执行后:更新其release值为3.0
内容的提问来源于stack exchange,提问作者Hooch
相关产品推荐
相关产品推荐

