以与输入中给出的顺序相同的顺序读取键值对中的 json 文件



我正在编写一个PowerShell脚本,它将读取具有不同部分的json文件,如job1,job2等。现在我的目标是分别阅读每个部分,并将其作为键值对循环。我还需要维护输入文件的顺序,因为作业是按顺序安排的。这些作业以 JSON 文件中的值作为输入运行。

我尝试使用Powershell版本5.1,其中我创建了PSCustomObject,但顺序按字母顺序排序,我不想要。


Json 文件:

{ "Job1": [
{
"Ram"                                   : "India",
"Anthony"                               : "London",
"Elena"                                 : "Zurich"
}],
"Job2": [
{ 
"Build"                                : "fail",
"Anthony"                              : "right",
"Sam"                                  : "left"
}]}

$json = Get-Content -Path C:PowershellScriptsconfig_File.json | 
ConvertFrom-Json
$obj = $json.Job1
$json.Job1 | Get-Member -MemberType NoteProperty | ForEach-Object {
$key = $_.Name
$values  = [PSCustomObject][ordered]@{Key = $key; Value = $obj."$key"}
$values
}

我希望以与 json 文件中提供的相同顺序分别遍历每个部分。例如,循环遍历 Job1 部分,并仅以与 json 文件中相同的顺序获取值。

我保证这不是最好的方法,但它有效。

$json = Get-Content -Path C:PowershellScriptsconfig_File.json | 
ConvertFrom-Json
$out = ($json.Job1 | Format-List | Out-String).Trim() -replace "s+(?=:)|(?<=:)s+"
$out -split "r?n" | ForEach-Object {
[PSCustomObject]@{Key = $_.Split(":")[0]; Value = $_.Split(":")[1]}
}

解释:

JSON 对象首先使用Format-List输出以生成Property : Value格式,该格式通过管道传输到Out-String以使该输出成为单个字符串。Trim()用于删除周围的空白区域。

-replace将删除:字符前后的所有空格。

-split r?n将单个字符串拆分为一组行。然后,这些行中的每一行都由:字符(.Split(":")(分隔。[0]索引选择:左侧的字符串。[1]选择:右侧的字符串。

你能改变 json 架构吗? 在尝试解析它之前,我可能会对 json 架构进行更改(当然,如果可能的话(。 像这样(仅更改了 Job1(:

$json = @"
{ "Job1": [
{
"Name": "Ram",
"Location" : "India"
},
{
"Name": "Anthony",
"Location": "London"
},
{
"Name": "Elena" ,
"Location": "Zurich"
}
],
"Job2": [
{ 
"Build"                                : "fail",
"Anthony"                              : "right",
"Sam"                                  : "left"
}]}
"@ | convertfrom-json

foreach ($obj in $json.Job1) {
$key = $obj.Name
$values = [PSCustomObject][ordered]@{Key = $key; Value = $obj."$key" }
$values
}

最新更新