Azure DevOps:列表无序时如何替换JSON对象中的变量
在Azure DevOps中按条件替换JSON数组对象的变量
默认Azure DevOps的变量替换只能通过索引路径(比如Friends.1.Phone)修改数组元素,但当数组顺序不确定时,没法依赖索引定位。可以通过以下两种方式实现按属性匹配替换:
方法1:PowerShell脚本替换(跨平台适用)
在部署阶段添加一个PowerShell任务,通过脚本遍历数组、匹配目标对象后修改值:
# 读取目标JSON文件 $jsonContent = Get-Content -Path "your-config.json" -Raw | ConvertFrom-Json # 定义要匹配的名称和新手机号(这里引用流水线变量) $targetName = "Frank" $newPhone = "$(Frank_Phone)" # 遍历Friends数组,找到对应对象并更新手机号 foreach ($friend in $jsonContent.Friends) { if ($friend.Name -eq $targetName) { $friend.Phone = $newPhone break # 只替换第一个匹配项,需替换所有同名项就删掉这行 } } # 将修改后的内容写回文件 $jsonContent | ConvertTo-Json -Depth 10 | Set-Content -Path "your-config.json"
配置要点:
- 把
your-config.json换成实际的JSON文件路径 $(Frank_Phone)是你在Azure DevOps流水线里定义的变量,用来传入新的手机号- 如果要批量替换多个对象,可扩展脚本逻辑,比如定义一个包含姓名和手机号的哈希表循环处理
方法2:jq工具替换(Linux代理适用)
如果流水线用Linux代理,可借助jq这个轻量JSON命令行工具实现:
# 先确保代理安装jq(Ubuntu/Debian环境) apt-get update && apt-get install -y jq # 替换Name为Frank的对象的Phone值,FRANK_PHONE是流水线变量 jq --arg newPhone "$FRANK_PHONE" '.Friends[] |= (if .Name == "Frank" then .Phone = $newPhone else . end)' your-config.json > temp.json && mv temp.json your-config.json
配置要点:
- 若代理未预装
jq,先执行安装命令再处理JSON - 命令通过
mv temp.json your-config.json覆盖原文件,避免直接写入时的权限问题
通用注意事项:
- 确保替换任务执行前,JSON文件已经下载到代理的工作目录
- PowerShell脚本中的
-Depth参数要根据JSON嵌套深度调整,防止序列化时截断内容 - 本地先验证脚本逻辑,再放到流水线中运行
内容的提问来源于stack exchange,提问作者K. Zimmermann
相关产品推荐
相关产品推荐

