PowerShell调用REST接口时如何转义JSON字符串中的{}等特殊字符
问题解决方法
核心错误原因
你手动拼接JSON字符串、手动转义大括号的操作是错误的。JSON规范里大括号如果是字符串内部的内容,不需要单独转义,只有作为JSON结构的大括号才是语法标记。你手动给大括号加反斜杠转义,反而会让JSON解析器识别到非法的转义字符,触发格式错误。
正确实现方案
直接用PowerShell内置的ConvertTo-Json处理JSON序列化,它会自动识别所有需要转义的特殊字符(包括双引号、反斜杠、控制字符等),不需要你手动处理任何转义逻辑:
# 1. 读取并预处理HTML内容,仅移除多余空白字符,不需要做任何转义 $HtmlBodyFilename = "$PSScriptRoot\Emailbody_Home.html" $HtmlFromFile = Get-Content $HtmlBodyFilename -Raw $HtmlFromFileStripped = $HtmlFromFile.Replace("`r", "").Replace("`n", "").Replace("`t","") $templateID = "Test_Temp7" # 2. 构造PowerShell对象,直接填原始属性值 $bodyObj = [PSCustomObject]@{ uuid = $templateID subject = "My Email Subject" body = $HtmlFromFileStripped } # 3. 自动序列化为合法JSON,自动处理所有转义 $body = $bodyObj | ConvertTo-Json -Depth 10 # 4. 校验JSON格式,这一步基本不会再报错 $bodyJSON = ConvertFrom-Json $body # 5. 构造请求参数,额外添加兼容配置避免连接中断 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $params = @{ Uri = 'https://stage-tms.demo.com/templates/email' Headers = $headers Method = 'POST' Body = $body ContentType = 'application/json' UseBasicParsing = $true } # 发送请求 # Invoke-RestMethod @params
大文件报错定位方法
针对83KB真实HTML文件的报错,可以按以下步骤定位问题:
- 把序列化后的
$body内容输出到本地文件:$body | Out-File -FilePath "debug.json" -Encoding utf8,用JSON校验工具打开,就能直接看到哪一部分有格式错误 - 如果移除校验后出现连接意外关闭,优先检查:
- 服务端是否限制了POST请求的最大大小
- 确认请求的TLS版本和服务端要求一致,已经添加的Tls12配置可以解决大部分这类问题
- 检查HTML内容中是否存在未闭合的双引号、特殊控制字符
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

