JSON格式,来自文件或变量

时间:2018-04-28 08:49:45

标签: json powershell pretty-print

我有一个PS脚本,它在变量ant中获取JSON,然后将其保存在文件中。

不幸的是,它在一个字符串中获取值,如下所示:

{   "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 :(得分:3)

默认情况下,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会抛出错误。

在读取和写入JSON文件时,请始终显式指定UTF8编码。

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

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

原因是

  • 通过广泛接受的约定,JSON文件应该是UTF8。
  • 除非另有说明,Get-ContentSet-Content将使用系统的默认编码来读/写文本文件。
  • 系统默认很少使用UTF-8,大部分时间它都是传统的单字节编码,如Windows-1252。
  • 这会产生风险
    • 在读取JSON文件时,修改了在JSON中合法的Unicode字符。
    • 创建非UTF-8的JSON文件,使其他人难以使用。

实际上,在处理文本文件时,请始终明确指定编码,而不仅仅是JSON。