JSON 格式化,来自文件或变量
JSON formatting, either from file or variable
我有一个 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[=13=].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"
默认情况下,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-Content
和 Set-Content
将使用系统的默认编码来 read/write 文本文件。
- 系统默认很少是 UTF-8,大多数时候它会是传统的单字节编码,如 Windows-1252。
- 这会产生以下风险
- 读取 JSON 文件时,在 JSON 中处理合法的 Unicode 字符。
- 创建 JSON 非 UTF-8 的文件,使其难以被其他人使用。
事实上,在处理文本文件时,请务必明确指定编码,而不仅仅是 JSON。
我有一个 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[=13=].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"
默认情况下,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-Content
和Set-Content
将使用系统的默认编码来 read/write 文本文件。 - 系统默认很少是 UTF-8,大多数时候它会是传统的单字节编码,如 Windows-1252。
- 这会产生以下风险
- 读取 JSON 文件时,在 JSON 中处理合法的 Unicode 字符。
- 创建 JSON 非 UTF-8 的文件,使其难以被其他人使用。
事实上,在处理文本文件时,请务必明确指定编码,而不仅仅是 JSON。