Powershell Invoke-Webrequest w/ JSON Body - 无法反序列化...?

J. *_*Doe 2 powershell json

我需要使用特定格式的主体执行 Invoke-Webrequest 以将设备添加到产品。这是它在 json 中的样子(直接来自供应商文档的示例):

$body_json = '{"datasource": [{
            "parentId": "123456789000",
            "name": "(name)",
            "id": "(value)",
            "typeId": 0,
            "childEnabled": false,
            "childCount": 0,
            "childType": 0,
            "ipAddress": "(ipAddress)",
            "zoneId": 0,
            "url": "(url)",
            "enabled": false,
            "idmId": 123456789000,
            "parameters": [{
                "key": "(key)",
                "value": "(value)"
            }]
        }]}'
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在其 json 表示中提交此文件时,出现以下错误:

Invoke-WebRequest :无法从 START_ARRAY 令牌中反序列化 com.vendor.etc.DataSourceDetail 的实例 [来源:java.io.StringReader@22c614; 行:1,列:1] 在 C:\powershell_script_location\ps.ps1:114 char 9 + $request = Invoke-WebRequest $url -Method Post -Headers $headers -Body $body_json - ... +~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException +fullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

问题在于“参数”参数的格式,因为在省略“参数”时请求可以正常提交,但是我添加的设备缺少重要的参数详细信息。

Invoke-WebRequest, JavaScriptSerializer, 供应商的代码是否有问题,或者这是用户错误?如果需要澄清,请告诉我。

不幸的是,我不知道com.vendor.etc.DataSourceDetail实例是什么样子,因为我使用的是 API,我无法直接访问它。

pfx*_*pfx 5

使用Invoke-RestMethod代替Invoke-WebRequest

如果您将正文作为字符串使用:

Invoke-RestMethod -Uri http://your-url.com -Method POST -Body $body_json -ContentType "application/json"   
Run Code Online (Sandbox Code Playgroud)

如果必须从数据/参数构造主体,则构建哈希表并通过ConvertTo-Json以下方式将其转换为 json 可能更容易:

$body_json = @{
    datasource = @(
        @{
            parentId = 123456789000
            name = "name"
            id = "value"
            typeId = 0
            childEnabled = $false
            childCount = 0
            childType = 0
            ipAddress = "ipAddress"
            zoneId = 0
            url = "url"
            enabled = $false
            idmId = 123456789000
            parameters = @( @{
                key = "key"
                value = "value"
            })
       })} | ConvertTo-Json -Depth 4

Invoke-RestMethod -Method 'Post' -Uri http://your-url.com -Body $body_json -ContentType "application/json"
Run Code Online (Sandbox Code Playgroud)