首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell --访问JObject中的JArray

PowerShell --访问JObject中的JArray
EN

Stack Overflow用户
提问于 2017-06-20 12:59:29
回答 2查看 3.7K关注 0票数 6

我有一个Json对象

代码语言:javascript
复制
 {
  "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"
        }
    ]
}

我所创造的

代码语言:javascript
复制
$config = [Newtonsoft.Json.Linq.JObject]::Parse($file)

我可以接触到

代码语言:javascript
复制
$config["ProjectDirectory"]
$config["VirtualDirectories"]

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

我确认

代码语言:javascript
复制
 $config["VirtualDirectories"][0].GetType() // JObject
 $config["VirtualDirectories"].GetType() // JArray
 $config // JObject

我试过了

代码语言:javascript
复制
$config["VirtualDirectories"][0]["Name"]
$config["VirtualDirectories"][0]["Path"]
$config["VirtualDirectories"][0][0]
$config["VirtualDirectories"][0].GetValue("Name")

当我尝试

代码语言:javascript
复制
 $config["VirtualDirectories"][0].ToString()

我得到了

代码语言:javascript
复制
{
      "Name": "Alerts",
      "Path": "\\Areas\\RemoteOrder\\Views\\Alerts"
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-20 14:43:45

你们关系很好。$config["VirtualDirectories"][0]["Name"]将给您一个包含文本的JValue。您只需要从那里使用Value属性来获得实际的字符串。下面是如何在ForEach循环中这样做:

代码语言:javascript
复制
$config = [Newtonsoft.Json.Linq.JObject]::Parse($file)

ForEach ($dir in $config["VirtualDirectories"])
{
    $name = $dir["Name"].Value
    $path = $dir["Path"].Value
    ...
}
票数 4
EN

Stack Overflow用户

发布于 2017-06-20 17:13:29

补充布赖恩·罗杰斯的有益回答

作为索引语法(["<name>"])的更方便的替代方案,您可以使用属性语法

(.<name>),因为返回的JObject实例具有以其键命名的动态属性:

代码语言:javascript
复制
$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相比,性能

  • 旁白:例如,有一个对于Json.NET可以用Install-Module -Scope CurrentUser newtonsoft.json安装,它隐式地允许您访问[Newtonsoft.Json.Linq.JObject]类型。但是,这个包装器--它将对象表示为有序的哈希表--比ConvertFrom-Json. 还要慢。
  • 除了性能之外,ConvertFrom-Json的下列限制可能使您有必要使用第三方库(如Json.Net ):
代码语言:javascript
复制
- 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

代码语言:javascript
复制
$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', ...
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44653771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档