2015-07-11 76 views
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

您誤解了您的數據結構。 $obj.servers是一個包含兩個字段的數組,其中每個字段都包含一個字典,而不是包含數組id的對象。你需要做這樣的索引訪問:

$obj.servers[0].id 

$obj.servers.id[0]肯定會拋出一個錯誤,因爲數組對象$obj.servers沒有一個屬性id,因此在PowerShell中V2 $obj.servers.id回報$null,並在索引訪問空數組失敗(如你所期望的)。

示範:

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

提取所有的ID只是管陣列爲ForEach-Object循環,你呼應id屬性:

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

謝謝!這樣一個簡單的錯誤。我也意識到'$ obj.server.id'應該是'$ obj.servers.id'。但我不知道如何循環並獲取每個id值,然後將其添加到數組中? – methuselah

相關問題