Рекурсивный цикл по объекту Json в powershell

#powershell-4.0

#powershell-4.0

Вопрос:

У меня есть json следующим образом

 {
  "cluster": [
    {
      "id": "cluster1.1",
      "color": "blue",
      "segment": [
        {
          "id": "segment1.1",
          "color": "green"
        }
      ]
    },
    {
      "id": "cluster1.2",
      "color": [
        "blue",
        "red"
      ],
      "segment": [
        {
          "id": "segment1.2",
          "color": "Yellow"
        }
      ]
    },
    {
      "id": "cluster1.3",
      "color": "Orange",
      "segment": [
        {
          "id": "cluster1.3",
          "color": "black"
        },
        {
          "id": "cluster1.4",
          "color": "Green"
        },
        {
          "id": "cluster1.5",
          "color": "red"
        }
      ]
    },
    {
      "id": "cluster1.4",
      "color": [
        "blue",
        "red"
      ],
      "segment": [
        {
          "id": "cluster1.4",
          "color": "red"
        },
        {
          "id": "cluster1.5",
          "color": "blue"
        },
        {
          "id": "cluster1.6",
          "color": "Yellow"
        }
      ]
    }
  ]
}
  

Я хотел бы рекурсивно выполнить цикл по всем узлам, я получаю содержимое следующим образом со следующим кодом, но я не просматриваю все узлы

 $jsonData = (Get-Content -FilePath) -join "`n" | ConvertFrom-Json

for( $i=0; $i -lt $jsonData.cluster.Length; $i  )
{
  $clusterInfo= $ReportingPackage.cluster[$i]
  $clusterInfo.Color
}
  

Мне нужно рекурсивно найти способ перебирать все сегменты и цвета

Ответ №1:

Массив.Сокращение ElementProperty извлекает свойства только для непосредственных элементов массива. Перечислите свойства вложенных элементов вручную:

 ForEach ($cluster in $jsonData.cluster) {
    $cluster.color
    $cluster.segment.color
}
  

Возможно, вы захотите использовать проверку работоспособности: if ($cluster.segment) { $cluster.segment.color }

Для сбора всех цветов в массив простейшим методом является конвейер:

 $allColors = $jsonData.cluster | ForEach {
    $_.color
    $_.segment.color
}
  

Комментарии:

1. Привет, спасибо, когда я пытаюсь получить уникальные цвета без дублирования, которые я не могу получить $allColors.color| select -Unique , можете ли вы мне помочь

2. 1. Это другой вопрос. 2. Обязательно всегда проверяйте содержимое ваших данных в PowerShell ISE или console, потому что мой второй пример создает массив простых строк без .color свойства: $allColors | select -unique