PowerShell JSON字符串转义(反斜杠)

时间:2020-05-03 07:29:11

标签: json powershell

我需要使用PowerShell脚本将Json主体HttpPost到ASP.NET Core Web Api端点(控制器)。

$CurrentWindowsIdentity = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$CurrentPrincipalName = $CurrentWindowsIdentity.Identity.Name

# Build JSON payload
$JsonString = @"
{
    "CurrentPrincipalName":"$CurrentPrincipalName"
}
"@

$response = Invoke-RestMethod -Uri "https://webapiendpoint.tld/api/somecontroller" -Method Post -Body $JsonString -ContentType "application/json"

由于变量$ CurrentPrincipalName的值可以是domain \ username,因此由于反斜杠而无法正确转义,因此json get无效。

网络api日志中的错误:

  JSON input formatter threw an exception: 'C' is an invalid escapable character within a JSON string. The string should be correctly escaped. Path: $.CurrentPrincipalName | LineNumber: 15 | BytePositionInLine: 36.
  System.Text.Json.JsonException: 'C' is an invalid escapable character within a JSON string. The string should be correctly escaped. Path: $.CurrentPrincipalName

我如何确保在创建json字符串并添加变量时-当然不能控制其值-json字符串可以正确转义?

我也尝试了ConvertTo-Json,例如:

$JsonConverted = $JsonString | ConvertTo-Json

然后是HttpPost该对象,但这更糟:

JSON input formatter threw an exception: The JSON value could not be converted to solutionname.model. Path: $ | LineNumber: 0 | BytePositionInLine: 758.

1 个答案:

答案 0 :(得分:3)

创建JSON文本的可靠方法是首先将数据构造为哈希表(@{ ... })或自定义对象([pscustomobject] @{ ... },然后通过管道ConvertTo-Json

$JsonString = @{
  CurrentPrincipalName = $CurrentPrincipalName
} | ConvertTo-Json

注意:如果您有多个属性,并且想要以JSON表示形式保留其定义顺序,请使用 ordered 哈希表([ordered] @{ ... })或自定义对象。

这样,PowerShell将为您执行任何必要的转义值,特别是将\值中的文字$CurrentPrincipalName字符加倍以确保将其视为 literal