如何将PowerShell数组合并到PSCustomObject生成正确JSON结构?
问题:构建API调用JSON Payload时的结构错误排查
我正在构建一个生成API调用JSON payload的函数,需要在主成员contact下添加数组类型的子成员fieldValues。试了两种写法都没得到正确结构:第一种生成的数组内容异常,第二种的fieldValues不在contact成员内。以下是错误示例代码和预期的正确JSON格式,求指出问题所在。
错误示例1代码
[PSCustomObject] $contactMain = @{} [PSCustomObject] $contactDetail_Native = @{} [array] $contactDetail_Custom = @() $contactDetail_Custom = ` [PSCustomObject]@{ field = '1' value = '1001' } $contactDetail_Custom += $contactDetail_Custom $contactDetail_Custom = ` [PSCustomObject]@{ field = '2' value = '1002' } $contactDetail_Custom += $contactDetail_Custom $contactDetail_Native = ` [ordered]@{ email = 'brucebanner@myfakeemail.com' lastName = 'Banner' firstName = 'Bruce' } $contactDetail_Native.Add('fieldValues', $contactDetail_Custom) $contactMain | Add-Member -MemberType NoteProperty -Name 'contact' -Value $contactDetail_Native -Force #$contactMain | Add-Member -MemberType NoteProperty -Name 'fieldValues' -Value $contactDetail_Custom -Force $contactMain = $contactMain | ConvertTo-Json $contactMain
错误示例2代码
[PSCustomObject] $contactMain = @{} [PSCustomObject] $contactDetail_Native = @{} [array] $contactDetail_Custom = @() $contactDetail_Custom = ` [PSCustomObject]@{ field = '1' value = '1001' } $contactDetail_Custom += $contactDetail_Custom $contactDetail_Custom = ` [PSCustomObject]@{ field = '2' value = '1002' } $contactDetail_Custom += $contactDetail_Custom $contactDetail_Native = ` [ordered]@{ email = 'brucebanner@myfakeemail.com' lastName = 'Banner' firstName = 'Bruce' } #$contactDetail_Native.Add('fieldValues', $contactDetail_Custom) $contactMain | Add-Member -MemberType NoteProperty -Name 'contact' -Value $contactDetail_Native -Force $contactMain | Add-Member -MemberType NoteProperty -Name 'fieldValues' -Value $contactDetail_Custom -Force $contactMain = $contactMain | ConvertTo-Json $contactMain
预期正确的JSON格式
{"contact": { "firstName": "Bruce", "lastName": "Banner", "email": "brucebanner@myfakeemail.com", "fieldValues": [ { "field": "1", "value": "1001" }, { "field": "2", "value": "1002" } ] }}
问题分析与修正
错误示例1的核心问题
数组构建逻辑错误:
- 每次执行
$contactDetail_Custom = [PSCustomObject]@{...}时,会直接覆盖之前的数组变量,把它从数组变成单个对象。 - 随后的
$contactDetail_Custom += $contactDetail_Custom是将当前对象追加给自己,导致数组里是重复的同一个对象,最终得到的是两个field=2的对象,而非field=1和field=2各一个。
错误示例2的核心问题
结构层级错误:
你把fieldValues直接添加到了根对象contactMain上,而非contact子对象内部,导致它不在预期的层级里。
修正后的代码(两种写法)
写法1:直接嵌套构建
# 一次性构建完整结构 $contactMain = [PSCustomObject]@{ contact = [PSCustomObject]@{ email = 'brucebanner@myfakeemail.com' lastName = 'Banner' firstName = 'Bruce' fieldValues = @( [PSCustomObject]@{ field = '1' value = '1001' }, [PSCustomObject]@{ field = '2' value = '1002' } ) } } # 转换为JSON时指定Depth,避免嵌套结构被截断 $contactMain | ConvertTo-Json -Depth 3
写法2:分步构建
# 正确初始化数组并添加两个不同对象 $contactDetail_Custom = @() $contactDetail_Custom += [PSCustomObject]@{ field = '1' value = '1001' } $contactDetail_Custom += [PSCustomObject]@{ field = '2' value = '1002' } # 构建contact子对象,直接包含fieldValues $contactDetail_Native = [ordered]@{ email = 'brucebanner@myfakeemail.com' lastName = 'Banner' firstName = 'Bruce' fieldValues = $contactDetail_Custom } # 构建主对象 $contactMain = [PSCustomObject]@{ contact = $contactDetail_Native } # 转换为JSON $contactMain | ConvertTo-Json -Depth 3
关键注意点
- 数组构建:要么用
@()一次性包裹多个对象,要么逐个追加时不要覆盖原有数组变量。 - 层级控制:确保
fieldValues是contact对象的属性,而非根对象属性。 ConvertTo-Json的-Depth参数:默认深度为2,嵌套层级超过2时必须指定足够的深度,否则会导致结构被截断。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

