Powershell не может конвертировать при преобразовании значений из "&" в JSON - PullRequest
0 голосов
/ 06 декабря 2018

RoleFullPath

Applications\User Admin & Support-DEMO

Код PowerShell

$NewJSON.roleFullPath = $Line.RoleFullPath
.
.
.
.
$JSONPath = $RolePath + $FolderName  + "-JSON.json"   
Convertto-JSON $NewJSON | Out-file -Encoding "UTF8" $JSONPath

Вывод:

"roleFullPath":  "Applications\\User Admin \u0026 Support-DEMO"

При преобразовании из CSV в JSON, символ ' & 'преобразуется в' \ u0026 '

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Чтобы не дать Powershell выполнить эту трубу, ваш вывод Json через эту

$jsonOutput | ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Set-Content $jsonPath -Encoding UTF8;

Это предотвратит преобразование &:)

0 голосов
/ 06 декабря 2018

В Windows PowerShell v5.1 ConvertTo-Json действительно неожиданно кодирует & символов как escape-последовательность Unicode \u0026, где 0026 представляет шестнадцатеричный код.число 0x26, кодовая точка Unicode, представляющая символ &, U+0026.
(PowerShell Core , напротив, сохраняет & как есть.)

При этом парсеры JSON должны иметь возможность интерпретировать такие escape-последовательности , и, действительно, дополнительный командлет ConvertFrom-Json имеет вид.

При этом если вы хотите вручную преобразовать escape-последовательности Unicode в их символьные эквиваленты в тексте JSON, вы можете использовать следующее:

# Sample JSON with Unicode escapes.
$json = '{ "roleFullPath":  "Applications\\User Admin \u0026 Support-DEMO" }'

# Replace Unicode escapes with the chars. they represent.
[regex]::replace($json, '\\u[0-9a-f]{4}', { 
  param($match) [char] [int] ('0x' + $match.Value.Substring(2)) 
})

Выше приведено:

{ "roleFullPath": "Applications\\User Admin & Support-DEMO" }

Обратите внимание, как \u0026 был преобразован в символ.&.

Caveat :

Существуют символы, которые должны быть экранированными в JSON и не могутбыть представленными буквально, поэтому в порядке для преобразования в символ для работы в общем эти символы должны быть исключены :

# Sample JSON with Unicode with:
#  & encodes as \u0026, which CAN be converted
#  a newline encoded as \u000A, which CANNOT be converted (though
#  you could translate it to '\n')
$json = '{ "roleFullPath": "Applications\u000aUser Admin \u0026 Support-DEMO" }'

# Replace Unicode escapes with the chars. they represent,
# but only if it's safe to do so.
[regex]::replace($json, '\\u[0-9a-f]{4}', { 
  param($match)
  $codePoint = [int] ('0x' + $match.Value.Substring(2))
  if ($codePoint -le 0x1f -or $codePoint -in 0x22, 0x5c) {
    $match.Value # retain escape sequence
  } else { # translate to literal char.
    [char] $codePoint
  }
})

Как упоминалось в комментариях, этот подход можно уточнить, обнаруживая кодовые точки, которые имеют escape-последовательности в стиле C, такие как \n для \u000A, и выводить их.Аналогично, " и \, представленные как \u0022 \u005c, могут быть переведены в \" и \\.

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