PowerShell: проблема ConvertTo-Json, содержащая специальные символы

Я пишу script для внесения изменений в файл JSON, но когда файл преобразуется обратно в JSON, он расширяет специальные символы.

Например, файл JSON содержит пароли с параметром "&". Быстрый способ репликации проблемы состоит в использовании следующей команды:

PS > "Пароль и 123" | ConvertTo-Json вывода: "Пароль\u0026123"

##Here is how I import the JSON FILE:
$jsonfile = (Get-Content .\example.json -Encoding Ascii) -join "`n" | ConvertFrom-Json
##Exporting JSON FILE without modifying it.
$jsonfile  | ConvertTo-Json |Out-File "new.json"

- вот пример упрощенного файла JSON FILE

{
    "Server1":
    {
        "username":"root",
        "password":"Password&dfdf"
    },
    "Server2":
    {
        "username":"admin",
        "password":"Password&1234"
    }
}

Ответ 1

Это вызвано функцией автоматического отключения символа Convertto-Json и влияет на несколько символов, таких как <>\'&

ConvertFrom-Json правильно прочитает экранированные символы. Используя ваш пример:

PS C:\> {"Password\u0026123"} | ConvertFrom-Json
Password&123

И ваш примерный код приводит к файлу с экранированными символами, но ConvertFrom-Json может прочитать его обратно к исходным паролям. См. Ниже:

PS C:\> (Get-Content .\example.json -Encoding Ascii) -join "`n" | ConvertFrom-Json
Server1                                  Server2
-------                                  -------
@{username=root; password=Password&dfdf} @{username=admin; password=Password&1234}

PS C:\> (Get-Content .\new.json -Encoding Ascii) -join "`n" | ConvertFrom-Json
Server1                                  Server2
-------                                  -------
@{username=root; password=Password&dfdf} @{username=admin; password=Password&1234}

Если вам понадобятся пароли, которые не сохранены, может потребоваться некоторая оптимизация. См. Эту тему о Преобразование строк Unicode в экранированные строки ascii

В качестве альтернативы, если возможно, избегайте затронутых символов.

Ответ 2

Попробуйте метод Unescape():

$jsonfile | ConvertTo-Json | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Out-File "new.json"