PowerShell -如何在JSON字符串中转义{}用于REST调用



我正在读取一个HTML文件,需要将其作为字符串参数传递给JSON调用。HTML中有花括号用于css/styles。我在看这个问题,但我更多的是围绕JSON特殊字符,其中一个是其他转义字符。文件也可以有[]字符

$HtmlFromFile2 = @"
<html>
<style type="text/css">.LetterList {font-family:"arial"}</style>
<body>
To [firstname]:
This is a normal body with special JSON characters. 
</body>
</html>
"@
$HtmlFromFile2Stripped = $HtmlFromFile2.Replace("`r", "").Replace("`n", "").Replace("`t","") 
#$HtmlFromFileFixed = % { [System.Text.RegularExpressions.Regex]::Unescape($HtmlFromFile2Stripped) }
$HtmlFromFileFixed = $HtmlFromFile2Stripped.Replace("{","{").Replace("}","}")
Write-Host "After RegEx Fix"
Write-Host $HtmlFromFileFixed 
$templateID = "Test_Temp7"

$body = @"
{   "uuid": "$templateID",
"subject": "My Email Subject",
"body": "$HtmlFromFileFixed"
}
"@
# This also tests if our JSON is "well-formed", on extra or missing commas, braces, brackets, etc... 
$bodyJSON = ConvertFrom-Json $body 
# Write-Host $body
$params = @{
Uri         = 'https://stage-tms.demo.com/templates/email'
Headers     = $headers
Method      = 'POST'
Body        = "$body"
ContentType = 'application/json'
}
#Invoke-RestMethod @params

我使用Convert-FromJSON作为测试。当它工作时,通常调用- restmethod也会工作。当Convert-FromJSON失败时,Invoke-RestMethod将返回http statsu=400和statusDescription="错误请求"。

当前错误:

ConvertFrom-Json : Invalid object passed in, ':' or '}' expected. (137): {   "uuid": "FEMAImport_Home_Test_Temp7",
"subject": "SBA Disaster Loan Assistance TestText",
"body": "<html>    <style type="text/css">.sbaLetterList {font-family:"arial"}</style><body>    This is a 
normal body with special JSON characters. </body></html>"
}
At C:ScriptsTestJSONEscapeBraces.ps1:38 char:13
+ $bodyJSON = ConvertFrom-Json $body
+             ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

更新1:我又做了些检查我最终得到了太多可行和不可行的排列。我不能包含我正在使用的整个HTML文件;我需要一种技术来隔离错误并识别它们。我希望ConvertFrom-JSON能帮我做到这一点。

从下面,你可以看到我正在尝试不同的文件。第一个文件(实际文件和较大的文件)在ConvertFrom-JSON和REST/Post上都失败了。其他两个正在工作。

$HtmlBodyFilename = "$PSScriptRootEmailbody_Home.html" 
#$HtmlBodyFilename = "$PSScriptRootEmailbody_Home_SimpleTest.html" 
#$HtmlBodyFilename = "$PSScriptRootEmailbody_Home_SimpleTestWithBraces.html" 
$HtmlFromFile = Get-Content $HtmlBodyFilename -Raw   #the -Raw option gets a string instead of an array of lins 
$HtmlFromFileStripped = $HtmlFromFile.Replace("`r", "").Replace("`n", "").Replace("`t","") 

我现在能够读取和处理一个带有花括号的简单测试文件。但是当我指向磁盘上真正的HTML文件时,我得到错误,并且不知道如何隔离它。我还以为是大括号呢

如果我使用ConvertFrom-JSON和真正的HTML文件,我得到:ConvertFrom-JSON:传入的无效对象,':'或'}'预期。(143): {" uid";FEMAImport_HomeFile_Test_Temp3";"subject"等等…

现在,如果我删除"ConvertFrom-JSON"并使用真正的HTML文件,我从SOAP请求中得到这个错误:"请求被中止:连接被意外关闭。"当然,不同之处在于文件要大得多,大约为83KB。

在此之前,我已经收到了很多400条"错误请求"。错误,这是一个无用的错误。我想知道这个请求有什么问题。

让Powershell为你做所有的工作,不要自己构建JSON字符串,使用一个对象:

$body = ConvertTo-Json @{
uuid = $templateID
subject = "My Email Subject"
body = Get-Content $HtmlBodyFilename -Raw
}

所有特殊字符将自动转义。

感谢@Hazrelle,当然在这种情况下你甚至不需要转换任何东西,因为Invoke-WebRequest会为你做:

$params = @{
Uri         = 'https://stage-tms.demo.com/templates/email'
Headers     = $headers
Method      = 'POST'
Body        = @{
uuid = $templateID
subject = "My Email Subject"
body = Get-Content $HtmlBodyFilename -Raw
}
ContentType = 'application/json'
}

您甚至不需要将任何内容转换为Json。Invoke-WebRequest会做的。

$body = @{   
uuid: $templateID,
subject: "My Email Subject",
body: $HtmlFromFileFixed
}
Invoke-WebRequest ... -Body $body

相关内容

  • 没有找到相关文章

最新更新