通过 Powershell 发布 JSON 对象

问题描述

我打算在运行 Powershell 脚本时有以下输出

{
  "maintenance_window": {
    "type": "maintenance_window","start_time": "2021-05-28T16:11:34.139Z","end_time": "2021-05-28T16:26:34.139Z","description": "Maintenance Window via Powershell","services": [
      {
        "id": "XYZ","type": "service_reference"
      }
    ]
  }
}

我的 .ps1 文件如下所示

Class service
{
    [String]$id
    [String]$type
}

Class maintenance_window
{
    [String]$type
    [String]$start_time
    [String]$end_time
    [String]$description
    [Collections.Generic.List[Service]] $services
}

Class maintenance_request
{ 
    [maintenance_window]$maintenance_window
}

Function Func()
{
    try
    {
        $uri = 'https://api.pagerduty.com/maintenance_windows'

        $start_date    = Get-Date 
        $start_time    = $start_date.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffK")
        $end_time      = $start_date.AddMinutes(15).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffK")

        $services      = New-Object Collections.Generic.List[service]
        $service       = New-Object service
        $service.id    = 'XYZ'
        $service.type  = 'service_reference' 

        $services.Add($service)

        $maintenance_window                =  New-Object maintenance_window
        $maintenance_window.type           = 'maintenance_window'
        $maintenance_window.start_time     =  $start_time 
        $maintenance_window.end_time       =  $end_time
        $maintenance_window.description    = 'Maintenance Window via Powershell'
        $maintenance_window.services       = $services

        # $maintenance_request                    = New-Object maintenance_request
        # $maintenance_request.maintenance_window  = $maintenance_window
        # $requestJson = $maintenance_request | ConvertTo-Json -Compress

        $requestJson = $maintenance_window | ConvertTo-Json -Compress

        Write-Host $requestJson
    }
    catch
    {
        Write-Host "Exception.`n $($_)"
    }
}

Func

这会产生输出

{
  "type": "maintenance_window","start_time": "2021-05-28T16:37:28.519Z","end_time": "2021-05-28T16:52:28.519Z","services": [
    {
      "id": "XYZ","type": "service_reference"
    }
  ]
}

但是,当我在注释行下方取消注释时

 #$maintenance_request                    = New-Object maintenance_request
 #$maintenance_request.maintenance_window  = $maintenance_window
 #$requestJson = $maintenance_request | ConvertTo-Json -Compress

并在脚本中的现有行下面注释掉

$requestJson = $maintenance_window | ConvertTo-Json -Compress

我得到的输出看起来不正确

{
  "maintenance_window": {
    "type": "maintenance_window","start_time": "2021-05-28T16:44:32.557Z","end_time": "2021-05-28T16:59:32.557Z","services": [
      "service"
    ]
  }
}

谁能帮我理解为什么 "services":["service"] 没有被序列化?

解决方法

添加 -Depth 可以解决问题。

$requestJson = ($maintenance_window | ConvertTo-Json -Compress  -Depth 3)