鉴于我正在处理以下$json
变量,我如何获取每个服务器ID(在这种情况下为215d1109-216d-48c3-af8e-998bb9bc3ca0
和440cf918-3ee0-4143-b289-f63e1d2000e6
)并将其放入数组?
现在$obj.servers.id
不返回任何内容(按预期方式),但$obj.servers.id[0]
会返回错误消息。
clear
[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions") | out-null
$json = '
{
"servers": [
{
"admin_password": "qpYU66rKxmnK",
"id": "215d1109-216d-48c3-af8e-998bb9bc3ca0",
"links": [
{
"href": "http://openstack.example.com/v3/servers/<id>",
"rel": "self"
},
{
"href": "http://openstack.example.com/servers/<id>",
"rel": "bookmark"
}
]
},
{
"admin_password": "wfksH3GTTseP",
"id": "440cf918-3ee0-4143-b289-f63e1d2000e6",
"links": [
{
"href": "http://openstack.example.com/v3/servers/<id>",
"rel": "self"
},
{
"href": "http://openstack.example.com/servers/<id>",
"rel": "bookmark"
}
]
}
]
}
'
$ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$obj = $ser.DeserializeObject($json)
$obj.servers.id;
请注意我使用的是Powershell 2.0。
答案 0 :(得分:1)
您误解了数据的结构。 $obj.servers
是一个包含两个字段的数组,每个字段包含一个字典,而不是包含数组id
的对象。您需要像这样进行索引访问:
$obj.servers[0].id
$obj.servers.id[0]
肯定会抛出错误,因为数组对象$obj.servers
没有属性id
,因此在PowerShell v2 $obj.servers.id
中返回{{1}空数组上的索引访问失败(正如您所期望的那样)。
演示:
$null
要提取所有ID,只需将数组传输到PS C:\> [void][Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions')
$json = @'
...
'@
PS C:\> $ser = New-Object Web.Script.Serialization.JavaScriptSerializer
PS C:\> $obj = $ser.DeserializeObject($json)
PS C:\> $obj.servers.GetType().FullName
System.Object[]
PS C:\> $obj.servers.id -eq $null
True
PS C:\> $obj.servers[0].GetType().Name
Dictionary`2
PS C:\> $obj.servers[0] | Format-Table -AutoSize
Key Value
--- -----
admin_password qpYU66rKxmnK
id 215d1109-216d-48c3-af8e-998bb9bc3ca0
links {System.Collections.Generic.Dictionary`2[System.Str...
PS C:\> $obj.servers[0].id
215d1109-216d-48c3-af8e-998bb9bc3ca0
循环,在其中回显ForEach-Object
属性:
id