gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:46:24 25 4
gpt4 key购买 nike

我正在读取一个 HTML 文件,需要将其作为字符串参数传递给 JSON 调用。HTML 中有用于 css/样式的花括号。我在看这个 question ,但我的更多是关于 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 作为测试。当它起作用时,通常 Invoke-RestMethod 就会起作用。当 Convert-FromJSON 失败时,Invoke-RestMethod 将返回 http statsu=400 和 statusDescription="Bad Request"。

当前错误:

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:\Scripts\TestJSONEscapeBraces.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 = "$PSScriptRoot\Emailbody_Home.html" 
#$HtmlBodyFilename = "$PSScriptRoot\Emailbody_Home_SimpleTest.html"
#$HtmlBodyFilename = "$PSScriptRoot\Emailbody_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):{“uuid”:“FEMAImport_HomeFile_Test_Temp3”,“主题”:等...

现在,如果我删除“ConvertFrom-JSON”并使用真正的 HTML 文件,我会从 SOAP 请求中收到此错误:“请求已中止:连接意外关闭。”当然,一个区别是文件要大得多,大约 83KB。

在此之前,我收到了很多 400 “Bad Request” 错误,这是一个无用的错误。我需要知道请求有什么问题。

最佳答案

让 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'
}

关于PowerShell - 如何在 REST 调用的 JSON 字符串中转义 {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69647261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com