PowerShell - 在JObject中访问JArray

Mik*_*ike 5 powershell json 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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我创造的

$config = [Newtonsoft.Json.Linq.JObject]::Parse($file)
Run Code Online (Sandbox Code Playgroud)

我可以访问类似的东西

$config["ProjectDirectory"]
$config["VirtualDirectories"]
Run Code Online (Sandbox Code Playgroud)

但是我无法访问VirtualDirectories JArray中的元素

我确认过了

 $config["VirtualDirectories"][0].GetType() // JObject
 $config["VirtualDirectories"].GetType() // JArray
 $config // JObject
Run Code Online (Sandbox Code Playgroud)

我试过了

$config["VirtualDirectories"][0]["Name"]
$config["VirtualDirectories"][0]["Path"]
$config["VirtualDirectories"][0][0]
$config["VirtualDirectories"][0].GetValue("Name")
Run Code Online (Sandbox Code Playgroud)

当我尝试

 $config["VirtualDirectories"][0].ToString()
Run Code Online (Sandbox Code Playgroud)

我明白了

{
      "Name": "Alerts",
      "Path": "\\Areas\\RemoteOrder\\Views\\Alerts"
}
Run Code Online (Sandbox Code Playgroud)

我真正想做的是访问它一个循环,但我似乎无法访问JObject元素

Bri*_*ers 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
    ...
}
Run Code Online (Sandbox Code Playgroud)