如何在PowerShell中合并具有动态属性的JSON对象?
解决PowerShell动态属性JSON对象合并问题
我太懂你在Azure DevOps流水线里遇到的这个JSON合并糟心事了——之前试的那些方法要么把数据覆盖了,要么输出的结果完全乱套,根本达不到预期。其实核心是要处理动态顶层属性的合并,不是简单的字符串拼接或者固定属性对象合并,用PowerShell的对象操作就能完美搞定。
具体实现思路&代码
咱们先把JSON转成PowerShell可操作的自定义对象,再把第二个对象的所有动态属性逐一加到第一个对象里,最后转回JSON就行,完全不会破坏结构:
# 你的原始JSON变量 $aVar = '{ "oldEmployees" : [ { "firstName": "Jane", "lastName": "Doe" }, { "firstName": "John", "lastName": "Doe" } ] }' $bVar = '{ "newEmployees" : [ { "firstName": "Joe", "lastName": "Doe" } ] }' # 把JSON字符串转成PowerShell自定义对象 $objA = $aVar | ConvertFrom-Json $objB = $bVar | ConvertFrom-Json # 遍历第二个对象的所有属性,添加到第一个对象中 foreach ($property in $objB.PSObject.Properties) { $objA | Add-Member -MemberType NoteProperty -Name $property.Name -Value $property.Value -Force } # 转换回JSON字符串(-Compress可选,适合Azure流水线压缩字符,避开4K上限) $mergedJson = $objA | ConvertTo-Json -Depth 10 -Compress
为什么这个方法靠谱?
- 对比
Join:直接拼字符串会把JSON结构搞崩,输出的内容根本不是有效的JSON;咱们操作的是对象,完美保留层级关系 - 对比
Merge/Combine-Object:这些工具大多针对固定属性的对象,遇到动态属性很容易覆盖或遗漏;通过遍历PSObject.Properties能精准抓取所有动态属性,确保一个都不丢 -Depth 10参数别忘:如果你的JSON嵌套层级深,得调整这个值防止内容被截断;-Compress对Azure流水线特别友好,能压缩字符数,刚好避开变量4K上限
运行后你就能得到完全符合预期的结果:
{ "oldEmployees": [ { "firstName": "Jane", "lastName": "Doe" }, { "firstName": "John", "lastName": "Doe" } ], "newEmployees": [ { "firstName": "Joe", "lastName": "Doe" } ] }
内容的提问来源于stack exchange,提问作者PEF
相关产品推荐
相关产品推荐

