将 json 变量分解为数组中的单个项目
Break down json variable into individual items in an arrays
如何将以下 json 变量分解为数组中的各个项目?
[
{
"server":{
"name":"myUbuntuServer1",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer2",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer3",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
]
例如,上面的内容将转换为一个数组,其中包含以下项目:
数组项 0
{
"server":{
"name":"myUbuntuServer1",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
数组项 1
{
"server":{
"name":"myUbuntuServer2",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
数组项 2
{
"server":{
"name":"myUbuntuServer3",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
我想在 Powershell 2.0 中完成此操作并单独访问每一个。到目前为止,这是我设法完成的:
$jsonarr = @()
$arr = (Get-Content C:\json.json| Out-String).replace("[","") -split "(})," -replace "]",""
$jsonarr += $arr[0..1] -join ""
$jsonarr += $arr[2..3] -join ""
$jsonarr += $arr[4]
然而,这是非常不灵活的,一旦我将另一台服务器的详细信息添加到 JSON 文件中,它就会停止工作。
对于 PowerShell v2,您可以使用 Convert between PowerShell and JSON
PS
PowerShell v3+,使用上面的工具应该是一样的:
$json = '[
{
"server":{
"name":"myUbuntuServer1",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer2",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer3",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
]'
$servers = ConvertFrom-Json $json
$servers.server.imageRef
returns
3afe97b2-26dc-49c5-a2cc-a2fc8d80c001
3afe97b2-26dc-49c5-a2cc-a2fc8d80c001
3afe97b2-26dc-49c5-a2cc-a2fc8d80c001
还有,别忘了"Get-Member"
PPS
PS C:\Users\joshua\Desktop> $servers.server| where name -EQ myUbuntuServer2
name imageRef flavorRef
---- -------- ---------
myUbuntuServer2 3afe97b2-26dc-49c5-a2cc-a2fc8d80c001 6
PS C:\Users\joshua\Desktop> $servers.server| where name -EQ myUbuntuServer2 | select -Property flavorRef
flavorRef
---------
6
PPPS
当然还有
$servers.server[0]
你应该也可以按名称索引,但我在 atm 上犯了一些愚蠢的错误
如何将以下 json 变量分解为数组中的各个项目?
[
{
"server":{
"name":"myUbuntuServer1",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer2",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer3",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
]
例如,上面的内容将转换为一个数组,其中包含以下项目:
数组项 0
{
"server":{
"name":"myUbuntuServer1",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
数组项 1
{
"server":{
"name":"myUbuntuServer2",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
数组项 2
{
"server":{
"name":"myUbuntuServer3",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
我想在 Powershell 2.0 中完成此操作并单独访问每一个。到目前为止,这是我设法完成的:
$jsonarr = @()
$arr = (Get-Content C:\json.json| Out-String).replace("[","") -split "(})," -replace "]",""
$jsonarr += $arr[0..1] -join ""
$jsonarr += $arr[2..3] -join ""
$jsonarr += $arr[4]
然而,这是非常不灵活的,一旦我将另一台服务器的详细信息添加到 JSON 文件中,它就会停止工作。
对于 PowerShell v2,您可以使用 Convert between PowerShell and JSON
PS
PowerShell v3+,使用上面的工具应该是一样的:
$json = '[
{
"server":{
"name":"myUbuntuServer1",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer2",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
},
{
"server":{
"name":"myUbuntuServer3",
"imageRef":"3afe97b2-26dc-49c5-a2cc-a2fc8d80c001",
"flavorRef":"6"
}
}
]'
$servers = ConvertFrom-Json $json
$servers.server.imageRef
returns
3afe97b2-26dc-49c5-a2cc-a2fc8d80c001
3afe97b2-26dc-49c5-a2cc-a2fc8d80c001
3afe97b2-26dc-49c5-a2cc-a2fc8d80c001
还有,别忘了"Get-Member"
PPS
PS C:\Users\joshua\Desktop> $servers.server| where name -EQ myUbuntuServer2
name imageRef flavorRef
---- -------- ---------
myUbuntuServer2 3afe97b2-26dc-49c5-a2cc-a2fc8d80c001 6
PS C:\Users\joshua\Desktop> $servers.server| where name -EQ myUbuntuServer2 | select -Property flavorRef
flavorRef
---------
6
PPPS
当然还有
$servers.server[0]
你应该也可以按名称索引,但我在 atm 上犯了一些愚蠢的错误