我正在编写一个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
}