PowerShell--访问JObject内的JArray

6
我有一个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元素。
2个回答

4

你已经接近正确答案了。 $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
    ...
}

4

为了补充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相比。

  • 顺便提一下:您可以使用Install-Module -Scope CurrentUser newtonsoft.json安装一个Json.NET的PowerShell封装,从而隐式地让您访问[Newtonsoft.Json.Linq.JObject]类型。但是,这个表示对象为有序哈希表的封装比ConvertFrom-Json还要

  • 除了性能之外,以下ConvertFrom-Json的限制可能会使使用第三方库(如Json.Net)成为必要:

    • 不支持空字符串键。
    • 仅在大小写不同的情况下(例如,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', ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接