JSON форматирование, либо из файла, либо из переменной - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть сценарий PS, который получает JSON в переменной ant, а затем сохраняет его в файле.

К сожалению, он получает значение в одну строку, например:

{   "persistentdataapi": "https://somevalue.azurewebsites.net/",   "collectioncountapi": "https://anothervalue.azurewebsites.net/",   "eventserviceapi": "https://thirdvalue.azurewebsites.net/",   "securityserviceapi": "https://fourthvalue.azurewebsites.net/" }

Есть ли способ обработать это значение посредством некоторого (предпочтительно PS) форматирования JSON, чтобы получить это:

{
"persistentdataapi": "https://somevalue.azurewebsites.net/",
"collectioncountapi": "https://anothervalue.azurewebsites.net/",
"eventserviceapi": "https://thirdvalue.azurewebsites.net/",
"securityserviceapi": "https://fourthvalue.azurewebsites.net/",
}

Код для получения значения в Jenkins:

Import-Module "C:\Program Files\WindowsPowerShell\Modules\Octopus-Cmdlets\0.4.4\Octopus-Cmdlets.psd1"

connect-octoserver http://internal-Octopus.azure.com:8082 API-123456789012345678
$raw = (Get-OctoVariable var.Portal.Web DataAPIJson | Where-Object { $_.Environment -eq "QA" } )

$raw.Value | Out-File "$env:WORKSPACE\portal\var.Portal.Web\dataapi.json"

1 Ответ

0 голосов
/ 28 апреля 2018

Powershell по умолчанию довольно печатает любой JSON, который он производит.

Таким образом, правильный способ сделать симпатичную печать состоит в том, чтобы проанализировать строку JSON в объект и немедленно преобразовать ее обратно в строку JSON.

$json = '{   "persistentdataapi": "https://somevalue.azurewebsites.net/",   "collectioncountapi": "https://anothervalue.azurewebsites.net/",   "eventserviceapi": "https://thirdvalue.azurewebsites.net/",   "securityserviceapi": "https://fourthvalue.azurewebsites.net/" }'

$json | ConvertFrom-Json | ConvertTo-Json

производит

{
    "persistentdataapi":  "https://somevalue.azurewebsites.net/",
    "collectioncountapi":  "https://anothervalue.azurewebsites.net/",
    "eventserviceapi":  "https://thirdvalue.azurewebsites.net/",
    "securityserviceapi":  "https://fourthvalue.azurewebsites.net/"
}

или в вашем случае

$file = "$env:WORKSPACE\portal\var.Portal.Web\dataapi.json"
$raw.Value | ConvertFrom-Json | ConvertTo-Json | Out-File $file -Encoding UTF8

В качестве побочного эффекта это также гарантирует, что JSON в файле действителен, потому что в противном случае ConvertFrom-Json выдаст ошибку.

Пожалуйста, всегда явно указывайте кодировку UTF8 при чтении и записи файлов JSON.

$data = Get-Content $file -Encoding UTF8 | ConvertFrom-Json

$data | ConvertTo-Json | Set-Content $file -Encoding UTF8

Причина этого

  • Согласно общепринятому соглашению, файлы JSON должны иметь формат UTF8.
  • Если не указано иное, Get-Content и Set-Content будут использовать кодировку системы по умолчанию для чтения / записи текстовых файлов.
  • Системное значение по умолчанию очень редко - UTF-8, в большинстве случаев это будет устаревшая однобайтовая кодировка, такая как Windows-1252.
  • Это создает риск
    • искажение символов Юникода, допустимых в JSON, при чтении файла JSON.
    • создание файлов JSON, отличных от UTF-8, что затрудняет их использование другими пользователями.

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

...