В 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
, могут быть переведены в \"
и \\
.