2017-06-20 83 views
4

我有一個JSON對象PowerShell的 - 訪問一個JArray一個JObject

{ 
    "ProjectDirectory": "C:\\Main", 
    "SiteName": "RemoteOrder", 
    "ParentPath": "/Areas//Views", 
    "VirtualDirectories": [ 
     { 
      "Name": "Alerts", 
      "Path": "\\Areas\\RemoteOrder\\Views\\Alerts" 
     }, 
     { 
      "Name": "Analytics", 
      "Path": "\\Areas\\RemoteOrder\\Views\\Analytics" 
     }, 
     { 
      "Name": "Auth", 
      "Path": "\\Areas\\RemoteOrder\\Views\\Auth" 
     } 
    ] 
} 

,我通過

$config = [Newtonsoft.Json.Linq.JObject]::Parse($file) 

創建我可以訪問之類的東西

$config["ProjectDirectory"] 
$config["VirtualDirectories"] 

但我可以在裏面沒有得到VirtualDirectories裏面的元素JArray

我證實

$config["VirtualDirectories"][0].GetType() // JObject 
$config["VirtualDirectories"].GetType() // JArray 
$config // JObject 

我已經試過

$config["VirtualDirectories"][0]["Name"] 
$config["VirtualDirectories"][0]["Path"] 
$config["VirtualDirectories"][0][0] 
$config["VirtualDirectories"][0].GetValue("Name") 

當我嘗試

$config["VirtualDirectories"][0].ToString() 

我得到

{ 
     "Name": "Alerts", 
     "Path": "\\Areas\\RemoteOrder\\Views\\Alerts" 
} 

什麼我真的想做的是訪問它一個循環,但我可以再次似乎沒有訪問JObject元素

回答

3

你就近了。 $config["VirtualDirectories"][0]["Name"]會給你一個JValue包含文字。您只需使用Value屬性即可獲取實際的字符串。這裏是你將如何做一個ForEach循環:

$config = [Newtonsoft.Json.Linq.JObject]::Parse($file) 

ForEach ($dir in $config["VirtualDirectories"]) 
{ 
    $name = $dir["Name"].Value 
    $path = $dir["Path"].Value 
    ... 
} 
2

補充Brian Rogers' helpful answer

作爲一個更方便的替代指數語法(["<name>"]),可以使用財產語法
.<name>),因爲返回的JObject實例具有動態屬性,它們的鍵名爲:

$config = [Newtonsoft.Json.Linq.JObject]::Parse($file) 

foreach ($dir in $config.VirtualDirectories) { 
    $name = $dir.Name.Value # as in Brian's answer: note the need for .Value 
    $path = $dir.Path.Value # ditto 
    # Sample output 
    "$name=$path" # outputs 'Alerts=\Areas\RemoteOrder\Views\Alerts', ... 
} 

我推測的理由您選擇工作,Json.NET類型直接性能相比PowerShell的內置ConvertFrom-Json cmdlet的。

  • 順便說一句:有一個PowerShell wrapper for Json.NET您可以用Install-Module -Scope CurrentUser newtonsoft.json安裝,例如,它隱,您可以訪問到[Newtonsoft.Json.Linq.JObject]類型。然而,這個包裝 - 它表示對象訂購散列表 - 是甚至比ConvertFrom-Json慢。

  • 除了性能,以下限制ConvertFrom-Json可能會使有必要使用第三方庫,如Json。無論如何:

    • 不支持空字符串鍵。
    • 不支持在情況下(例如,fooFoo)不同的密鑰。

爲了便於比較,這裏的相當於 - 但一般速度較慢 - ConvertFrom-Json解決方案

ConvertFrom-Json表示JSON對象作爲[pscustomobject]情況下,其屬性命名爲鍵,允許更自然的語法而不需要訪問.Value

$config = ConvertFrom-Json $json 

foreach ($dir in $config.VirtualDirectories) { 
    $name = $dir.Name # no .Value needed 
    $path = $dir.Path # ditto 
    # Sample output 
    "$name=$path" # outputs 'Alerts=\Areas\RemoteOrder\Views\Alerts', ... 
}