PowerShell JSON экранирование строки (backsla sh) - PullRequest
1 голос
/ 03 мая 2020

Мне нужно подключить Json -тело к ASP. NET Конечной точке Core Web Api (контроллеру) с помощью скрипта PowerShell.

$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 может быть домен \ имя пользователя, json get недопустим из-за обратного слэса sh, который не экранирован должным образом.

Ошибка в журнале веб-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 Ответ

3 голосов
/ 03 мая 2020

Надежный способ создания JSON текста заключается в построении ваших данных в виде таблицы ha sh (@{ ... }) или пользовательского объекта ([pscustomobject] @{ ... }) сначала и передачи в ConvertTo-Json:

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

Примечание. Если у вас есть несколько свойств и вы хотите сохранить их порядок определения в представлении JSON, используйте упорядоченный га sh таблица ([ordered] @{ ... }) или пользовательский объект.

Таким образом, PowerShell выполняет любое необходимое экранирование значений, в частности, удваивая буквенный символ \ в вашем $CurrentPrincipalName значение, чтобы гарантировать, что он рассматривается как литерал .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...