如何通过PowerShell修改现有JSON对象属性并更新回原JSON结构
JSON条目修改回写实现方案
整个操作不需要对原始大JSON做全量解析重构,基于你已经提取出目标条目的前提,按以下流程操作即可:
通用操作流程
- 直接操作已提取的
$dacpacvariable对象,定位到Scope.Machine数组 - 先做去重校验:判断数组内是否已存在
"Machines-2",不存在再追加元素,避免重复执行脚本产生重复值 - 将修改后的条目同步回原始
$variables大对象,分两种情况处理:- 如果你用的是JavaScript、Python、C#、PowerShell这类默认对象引用传递的语言,修改
$dacpacvariable时原始大对象里的对应条目会自动同步,不需要额外回写 - 如果你之前提取条目时做了深拷贝、或者用的是值传递的语言,就拿条目的唯一
Id字段(值为c1f4fe9b-3c4d-8j02-0e7x-0a6528bn192c)遍历$variables列表,找到Id匹配的旧条目,用修改后的新条目整体替换即可
- 如果你用的是JavaScript、Python、C#、PowerShell这类默认对象引用传递的语言,修改
- 所有修改完成后,把
$variables重新序列化成JSON字符串,就能用于后续的接口回传、存储操作
常用环境代码参考
从你的变量命名($前缀)判断,大概率是PowerShell环境(常见于dacpac部署、Azure DevOps接口调用场景),可直接用以下代码:
# 追加元素,自动去重 if ($dacpacvariable.Scope.Machine -notcontains "Machines-2") { $dacpacvariable.Scope.Machine += "Machines-2" } # 仅当你之前对$dacpacvariable做过深拷贝时需要执行回写,引用传递场景可跳过 $targetIdx = 0 for ($i=0; $i -lt $variables.Count; $i++) { if ($variables[$i].Id -eq $dacpacvariable.Id) { $targetIdx = $i break } } $variables[$targetIdx] = $dacpacvariable # 序列化为JSON,注意必须指定足够大的Depth参数,默认深度2会损坏嵌套结构 $finalJson = $variables | ConvertTo-Json -Depth 10
如果是JavaScript/Node.js环境,参考代码如下:
// 追加元素去重 if (!$dacpacvariable.Scope.Machine.includes("Machines-2")) { $dacpacvariable.Scope.Machine.push("Machines-2") } // 值拷贝场景下的回写逻辑,引用传递场景可跳过 const targetIdx = $variables.findIndex(item => item.Id === $dacpacvariable.Id) if (targetIdx > -1) $variables[targetIdx] = $dacpacvariable // 序列化回JSON const finalJson = JSON.stringify($variables, null, 2)
注意点:序列化JSON时如果是多层嵌套结构,一定要确认序列化工具的深度配置,避免Scope这类嵌套对象被序列化成空值。
内容的提问来源于stack exchange,提问作者OBT
相关产品推荐
相关产品推荐

