JSON-преобразование Powershell, удаляющее escape-символы Юникода без удаления литерала \ n - PullRequest
3 голосов
/ 02 июня 2019

Мой вопрос похож на этот вопрос:

Файл JSON в PowerShell и обратно в файл JSON

При импорте и экспорте шаблонов ARM в powershell, используя Convert-FromJson и Convert-ToJson, вводятся escape-последовательности Юникода.

Я использовал код здесь , чтобы снова скрыться.

Пример кода (mutltiline для ясности):

$armADF = Get-Content -Path $armFile -Raw | ConvertFrom-Json
$armADFString = $armADF | ConvertTo-Json -Depth 50
$armADFString | 
    ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) } | 
    Out-File $outputFile

Вот документ, который я читал для Unescape

В результате выходной файл будет идентичным , за исключением , когда все экземпляры литерала \n (которые были в исходном файле JSON) превращаются в фактические возвраты каретки. Что нарушает шаблон ARM.

Если я не включу код Unescape, \n сохраняются, но также и символы Юникода, которые также нарушают шаблон ARM.

Похоже, мне нужно предварительно покинуть \n, поэтому, когда я звоню в Unescape, они превращаются в симпатичный маленький \n. Я пробовал пару вещей, таких как добавление этого перед вызовом unescape.

$armADFString = $armADFString -replace("\\n","\u000A")

Что не дает мне результатов, которые мне нужны.

Кто-нибудь сталкивался с этим и решил? Есть ли опытные художники по побегу?

1 Ответ

3 голосов
/ 02 июня 2019

Я перечитал документацию Unescape и заметил, что он также в основном удаляет ведущие символы \, поэтому я попробовал этот маловероятный фрагмент кода:

$armADF = Get-Content -Path $armFile -Raw | ConvertFrom-Json
$armADFString = $armADF | ConvertTo-Json -Depth 50
$armADFString = $armADFString -replace("\\n","\\n")
$armADFString | 
    ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) } | 
    Out-File $outputFile

Конечно - замена \\n на \\nимеет полный смысл: |

Более чем рад, что кто-то может предложить более элегантное решение.

РЕДАКТИРОВАТЬ: Я развертываю шаблоны ADF ARM, которые сами основаны на JSON.Короче говоря, я также обнаружил, что мне нужно добавить это, чтобы избежать выхода из законно экранированных кавычек:

$armADFString = $armADFString -replace('\\"','\\"')
...