我有一个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元素。
发布于 2017-06-20 14:43:45
你们关系很好。$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
...
}发布于 2017-06-20 17:13:29
作为索引语法(["<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 types 直接的原因是与PowerShell内置的ConvertFrom-Json cmdlet相比,性能。
Install-Module -Scope CurrentUser newtonsoft.json安装,它隐式地允许您访问[Newtonsoft.Json.Linq.JObject]类型。但是,这个包装器--它将对象表示为有序的哈希表--比ConvertFrom-Json. 还要慢。ConvertFrom-Json的下列限制可能使您有必要使用第三方库(如Json.Net ):- Empty-string keys are not supported.
- Keys that differ in _case_ only (e.g., `foo` vs. `Foo`) are not supported.
相比之下,下面是与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', ...
}https://stackoverflow.com/questions/44653771
复制相似问题