按照输入中给定的相同顺序读取键值对中的 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]
选择:
.
右边的字符串
我正在编写一个 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]
选择:
.