使用Powershell操纵json并将其发送到Web请求中

时间:2018-02-19 09:03:07

标签: json powershell httprequest

我试图操纵json对象并将其作为内容发送到put / post web请求的正文中。我的json的源代码是我磁盘上的一个文件。

这是我的Powershell脚本:

$urlBase = 'https://mysite.myapp.com/service/api/Item/'

$myJson = (Get-Content 'file.json' | ConvertFrom-JSON)   

# Then I manipulate my object
$id = $myJson.id
$myJson.version = '1.2.3.4'

# Request
$response = Invoke-RestMethod -Uri ($urlBase + $id) -Method Put -Body $myJson -ContentType 'application/json' -Headers $hdrs

当我执行我的脚本时,会收到以下错误消息:

Invoke-RestMethod : The remote server returned an error: (400) Bad Request.
At line:18 char:17
+ ... $response = Invoke-RestMethod -Uri ($urlBase + $id) -Method Put -Body ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

如果我为此更改了我的$ myJson asignment,请求工作正常......

$myJson = Get-Content 'file.json'

...,但是在发送之前我无法操纵我的json。

编辑: 如果我尝试使用ConvertTo-Json转换回来,我会得到同样的错误:

$convertedBack = $myJson | ConvertTo-Json

# Request
$response = Invoke-RestMethod -Uri ($urlBase + $id) -Method Put -Body $convertedBack -ContentType 'application/json' -Headers $hdrs

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的:您需要使用StreamWriter cmdlet将对象转换回JSON。

我看到你现在已经尝试过并遇到了同样的问题。所以我问你:1的价值究竟是你所期望的吗?将其转储到文件并检查!

我怀疑这个细节的原因是for有一点问题。特别是ConvertTo-Json参数,可能导致一些数据丢失。

$convertedBack

  

指定JSON表示中包含多少级别的包含对象。默认值为2.

没有ConvertTo-Json

的示例
-Depth

结果

-Depth

示例使用 -Depth

更改一行代码:

$basicJsonObject = @"
{
    "name": "George",
    "properties": {
        "mood": "jovial",
        "coffee": {
            "hasCoffee": true,
            "mugContents": {
                "milk": false,
                "doubleShot": true
            }
        }
    }
}
"@

$psObject = ConvertFrom-Json -InputObject $basicJsonObject

Write-Host "Freshly Imported"
Write-Host "DoubleShot = $($psObject.properties.coffee.mugContents.doubleShot)"

$convertedBack = ConvertTo-Json -InputObject $psObject

$reConverted = ConvertFrom-Json -InputObject $convertedBack

Write-Host "Re-Converted"
Write-Host "DoubleShot = $($reConverted.properties.coffee.mugContents.doubleShot)"

结果

Freshly Imported
DoubleShot = True
Re-Converted
DoubleShot = 

请注意新结果如何包含-Depth变量的值。这是因为数据不会在上游进一步丢失!