循环遍历$ json变量并抓取每个id以添加到数组

时间:2015-07-11 10:05:27

标签: arrays json powershell-v2.0

鉴于我正在处理以下$json变量,我如何获取每个服务器ID(在这种情况下为215d1109-216d-48c3-af8e-998bb9bc3ca0440cf918-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。

1 个答案:

答案 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