我试图操纵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
答案 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
变量的值。这是因为数据不会在上游进一步丢失!