You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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的核心问题

数组构建逻辑错误:

  1. 每次执行$contactDetail_Custom = [PSCustomObject]@{...}时,会直接覆盖之前的数组变量,把它从数组变成单个对象。
  2. 随后的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:54:58