首页 > 解决方案 > 在 powershell 中显示 Json 嵌套数组

问题描述

我编写了一个带有嵌套数组的 JSON 脚本,并尝试根据标题显示所有数据。但不幸的是,我无法做到这一点。我将我的 JSON 和 powershell 代码放在下面。请帮助我。

JSON 代码:

{
  "Deploy": {
    "ENV": "DIT",
    "Servers": [
      {
        "Webservers": [
          {
            "Server": ["Server1","Server2"],
            "site": ["website1","WebSite2"],
            "VDIR": ["WebSite1","WebSite2"]
          },
          {
            "Server": ["Server1","Server2"],
            "site": ["WebSite1","WebSite2"],
            "VDIR": ["WebSite1","WebSite2"]
          }
        ]
      },
      {
        "Winservers": [
          {
            "Server": ["Server1","Server2"],
            "winService": ["service1","service2"]
          },
          {
            "Server": ["Server3","Server4"],
            "winService": ["service3","service4"]
          }
        ]
      }
    ]
  }
}

电源外壳代码:

$Deploy=(Get-Content D:\Deploy.json -Raw) -join "`n"|ConvertFrom-Json

foreach($i in $Deploy.Deploy.Servers) {
    $s=($i | Get-Member -MemberType *property).Name
    Write-host "$s" -ForegroundColor Yellow
    foreach($j in $s) {
        $items=($i.$j|Get-Member -MemberType *property).Name
        Write-host "$items" -ForegroundColor Yellow
        foreach($k in $items) {
            $z=($j.$k | Get-Member -MemberType *property).Name
            Write-host "$z" -ForegroundColor Yellow
        }
    }
}

当前结果是:

网络服务器
服务器站点 VDIR
赢服务器
服务器 winService

但预期结果应如下所示:

网络服务器:
服务器: 站点: VDIR:
服务器列表 站点列表 VDIR 列表

服务器: 站点: VDIR:
服务器列表 站点列表 VDIR 列表
赢服务器:
服务器:服务:            
服务器列表 站点列表      

请帮助......我正在以不同的方式尽力而为,但没有一个给出预期的结果。

标签: jsonpowershell

解决方案


如果您想要实现的只是格式化输出,也许这更符合您的喜好

$deploy = Get-Content 'D:\Deploy.json' -Raw | ConvertFrom-Json

Write-Host "Webservers:`r`n-----------"
$items = @()
foreach ($server in $deploy.Deploy.Servers.Webservers) {
    foreach ($item in $server) {
        $items += New-Object -TypeName PSObject -Property ([ordered]@{
            Server = @($item.Server) -join ', '
            Sites  = @($item.site) -join ', '
            VDIR   = @($item.VDIR) -join ', '
        })
    }
}
$items | Out-String

Write-Host "Winservers:`r`n-----------"
$items = @()
foreach ($server in $deploy.Deploy.Servers.Winservers) {
    foreach ($item in $server) {
        $items += New-Object -TypeName PSObject -Property ([ordered]@{
            Server = @($item.Server) -join ', '
            WinService  = @($item.winService) -join ', '
        })
    }
}
$items | Out-String

输出将如下所示:

Webservers:
-----------

Server           Sites              VDIR              
------           -----              ----              
Server1, Server2 website1, WebSite2 WebSite1, WebSite2
Server1, Server2 WebSite1, WebSite2 WebSite1, WebSite2



Winservers:
-----------

Server           WinService        
------           ----------        
Server1, Server2 service1, service2
Server3, Server4 service3, service4

推荐阅读