按照输入中给定的相同顺序读取键值对中的 json 文件

Reading a json file in key value pair in the same order that's given in input

我正在编写一个 PowerShell 脚本,它将读取一个包含不同部分的 json 文件,例如 job1、job2 等等。现在我的 objective 是分别读取每个部分并作为键值对循环遍历它。我还需要维护输入文件的顺序,因为作业是按顺序安排的。这些作业 运行 将 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:\PowershellScripts\config_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 架构吗? 在我尝试解析它之前,我可能会更改 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
}

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

$json = Get-Content -Path C:\PowershellScripts\config_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]}
}

解释:

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

-replace 删除 : 个字符前后的所有白色 space。

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

右边的字符串