我有一个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
答案 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:
ConvertFrom-Json
与foo
)。相比之下,这是等效 - 但通常较慢 - Foo
解决方案:
ConvertFrom-Json
将JSON对象表示为ConvertFrom-Json
个实例,其属性以键命名,允许更自然的语法而无需访问[pscustomobject]
:
.Value