PowerShell - 在JObject中访问JArray

时间:2017-06-20 12:59:30

标签: json powershell json.net

我有一个Json对象

 {
  "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 Elements

2 个答案:

答案 0 :(得分: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
    ...
}

答案 1 :(得分:3)

补充 Brian Rogers' helpful answer

作为 index 语法(["<name>"])的更方便的替代方法,您可以使用 property 语法
.<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', ...
}

我认为,与PowerShell的内置版本相比,您选择直接使用Json.NET类型直接 的原因性能 {1}} cmdlet。

  • 暂且不说:例如,您可以使用ConvertFrom-Json安装PowerShell wrapper for Json.NET,这隐式授予您访问Install-Module -Scope CurrentUser newtonsoft.json类型的权限。但是,此包装器 - 将对象表示为有序哈希表 - 甚至比[Newtonsoft.Json.Linq.JObject] 更慢。

  • 除了效果之外,ConvertFrom-Json 的以下限制可能会使得必须使用第三方库,例如Json.Net:

    • 不支持空字符串键。
    • 不支持 case 中不同的键(例如ConvertFrom-Jsonfoo)。

相比之下,这是等效 - 但通常较慢 - Foo解决方案

ConvertFrom-Json将JSON对象表示为ConvertFrom-Json个实例,其属性以键命名,允许更自然的语法而无需访问[pscustomobject]

.Value