Отображать вложенные массивы Json в PowerShell

Я написал один сценарий 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"]
          }
        ]
      }
    ]
  }
}

Код Powershell:

$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
        }
    }
}

Текущий результат:

Webservers
Server site VDIR
Winservers
Server winService

Но ожидаемый результат должен быть таким, как показано ниже:

Webservers:
Server:                      Sites:            VDIR:
list of servers              list of sites      list of VDIR

Server:                      Sites:            VDIR:
list of servers              list of sites      list of VDIR
Winservers:
Server:                      services:            
list of servers              list of sites      

Пожалуйста, помогите ... Я стараюсь по-разному, но ни один из них не дал ожидаемого результата.

Позвольте мне дать вам стандартный совет для новичков: если ответ решает вашу проблему, примите его, щелкнув большую галочку (✓) рядом с ним и, при желании, проголосуйте за него (для голосования требуется 15 или более очков репутации ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за которое вы получите 2 очка репутации) и голосование поможет будущим читателям. См. соответствующая статья справочного центра. Если на ваш вопрос еще нет полного ответа, оставьте отзыв или самостоятельный ответ.

mklement0 18.06.2018 18:23
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
1
1 159
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

ОК. Думаю, твою проблему можно решить следующим образом.

$ht, $src = @{}, 'D:\sandbox\source.xml'
($srv = (Get-Content $src | ConvertFrom-Json).Deploy.Servers).ForEach{
   $name = $_.PSObject.Properties.Name
   $ht[$name] = $srv.$name
}

Write-Host Webservers -ForegroundColor Yellow
$ht.Webservers | Out-String

Write-Host Winservers -ForegroundColor Yellow
$ht.Winservers | Out-String

Привет, Грег, я пробовал описанным выше способом, но безуспешно. я не уверен, тестировали вы или нет. поскольку вкладка "Серверы" содержит вложенный массив. внутри каждого элемента есть вложенные массивы. следовательно, он не давал данных.

Siva Sankara Rao Bacha 17.06.2018 10:02

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно как и Зачем, он решает проблему, что улучшит долгосрочную ценность ответа.

Alexander 17.06.2018 11:38

Привет, Александр, Большое спасибо за ответ. Я могу получить ожидаемые значения. но я хочу получить результат, такой как веб-серверы -> сервер (заголовок) - (список серверов), сайты (заголовок) - (список элементов, vdir (заголовок) - (список элементов), как и другие элементы. поскольку я должен использовать эти значения в разных местах моего скрипта. любезно дайте свое предложение - Спасибо, Шива

Siva Sankara Rao Bacha 17.06.2018 12:23

Если то, чего вы хотите добиться, - это просто форматированный вывод, возможно, это вам больше по душе.

$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

Прагматичное решение только для отображения, которое не выводит точный формат, который вы описываете, но является кратким (PSv3 +):

(Get-Content -Raw D:\Deploy.json | ConvertFrom-Json).Deploy.Servers |
  ForEach-Object {
    $serverTypePropName = $_.psobject.properties.Name
    Write-Host "${serverTypePropName}:"
    $_.$serverTypePropName | Format-Table
  }
  • (Get-Content -Raw D:\Deploy.json | ConvertFrom-Json) преобразует ввод JSON в настраиваемые объекты.

  • .Deploy.Server обращается к свойству, имеющему значение массива, элементами которого являются объекты, свойства Webservers и Winservers которых, соответственно, содержат подмассивы сведений о сервере.

  • В блоке скрипта ForEach-Object:

    • $_.psobject.properties.Name извлекает имя одного свойства (Webservers или Winservers) каждого входного объекта, который содержит массив сведений о сервере.
    • $_.$serverTypePropName | Format-Table обращается к этому свойству и отображает массив сведений о сервере в виде таблицы. Обратите внимание, что явный использование Format-Table необходимо, потому что массивы деталей сервера имеют разные структуры свойств между Webservers и объектом Winservers; без явной команды форматирования / вывода будут отображаться только свойства массива первый.

С вашим образцом ввода приведенное выше дает:

Webservers:

Server             site                 VDIR
------             ----                 ----
{Server1, Server2} {website1, WebSite2} {WebSite1, WebSite2}
{Server1, Server2} {WebSite1, WebSite2} {WebSite1, WebSite2}


Winservers:

Server             winService
------             ----------
{Server1, Server2} {service1, service2}
{Server3, Server4} {service3, service4}

Другие вопросы по теме