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

Looping through $json variable and grabbing each id to add to an array

鉴于我正在处理以下 $json 变量,我将如何获取每个服务器 ID(即本例中的 215d1109-216d-48c3-af8e-998bb9bc3ca0440cf918-3ee0-4143-b289-f63e1d2000e6)并将其放入数组中?

现在 $obj.servers.id returns 什么都没有(如预期的那样),但是 $obj.servers.id[0] returns 一条错误消息。

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。

您误解了数据的结构。 $obj.servers是一个有两个字段的数组,每个字段包含一个字典,而不是包含数组id的对象。您需要像这样进行索引访问:

$obj.servers[0].id

$obj.servers.id[0]肯定会报错,因为数组对象$obj.servers没有属性id,所以在PowerShell v2中$obj.servers.id returns $null,对空数组的索引访问失败(如您所料)。

示范:

PS C:\> <b>[void][Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions')</b>
$json = @'
...
'@
PS C:\> <b>$ser = 新对象 Web.Script.Serialization.JavaScriptSerializer</b>
PS C:\> <b>$obj = $ser.DeserializeObject($json)</b>
PS C:\> <b>$obj.servers.GetType().FullName</b>
System.Object[]
PS C:\> <b>$obj.servers.id -eq $null</b>
真的
PS C:\> <b>$obj.servers[0].GetType().Name</b>
词典`2
PS C:\> <b>$obj.servers[0] |格式-Table -AutoSize</b>

核心价值
--- -----
admin_passwordqpYU66rKxmnK
编号 215d1109-216d-48c3-af8e-998bb9bc3ca0
链接 {System.Collections.Generic.Dictionary`2[System.Str...

PS C:\> <b>$obj.servers[0].id</b>
215d1109-216d-48c3-af8e-998bb9bc3ca0

要提取所有 ID,只需将数组通过管道传输到 ForEach-Object 循环中,在循环中回显 id 属性:

PS C:\> <b>$ids = $obj.servers | % { $_.id }</b>
PS C:\> <b>$ids</b>
215d1109-216d-48c3-af8e-998bb9bc3ca0
440cf918-3ee0-4143-b289-f63e1d2000e6