Not that straight forward if you want to group by rows of Value names. I took liberty of thinking the logic for you. Below code will output to csv what you need:
$jsonContent = Get-Content .\release.json | ConvertFrom-Json;
$environmentsArray = $jsonContent.environments;
# Create an array of data we will be putting into Excel
$arrData = @();
$columnNames = @();
$rowNames = @();
# Go through each "environments" property item in json and add "id" property to $columnNames without duplicates
for ($i=0; $i -lt $environmentsArray.Count; $i++) {
[bool]$existingColumnNameFound = $false;
foreach($existingCol in $columnNames) {
if($existingCol -eq $environmentsArray[$i].id) {
$existingColumnNameFound = $true;
}
}
if($existingColumnNameFound -eq $false) {
$columnNames += $environmentsArray[$i].id;
}
# go through each property in environments.variables property in json and add these properties to $rowNames without duplicates
$environmentsArray[$i].variables.psobject.properties | foreach {
[bool]$existingRowNameFound = $false;
foreach($existingRow in $rowNames) {
if($existingRow -eq $_.name) {
$existingRowNameFound = $true;
break;
}
}
if($existingRowNameFound -eq $false) {
$rowNames += $_.name;
}
}
}
foreach($existingRow in $rowNames) {
$objRowItem = New-Object System.Object;
$objRowItem | Add-Member -MemberType NoteProperty -Name "ValueName" -Value $existingRow;
# Create all columns for each row object
foreach($existingCol in $columnNames) {
$objRowItem | Add-Member -MemberType NoteProperty -Name $existingCol -Value "";
}
foreach($existingCol in $columnNames) {
# Populate the column in row object we are adding to $arrData
for ($i=0; $i -lt $environmentsArray.Count; $i++) {
$environmentsArray[$i].variables.psobject.properties | foreach {
# If json data "id" property and the value property name equal, add value to column
if(($_.name -eq $objRowItem.ValueName) -and ($existingCol.ToString() -eq $environmentsArray[$i].id.ToString())) {
$objRowItem.$existingCol = $_.value.value;
}
}
}
}
# Add this object containing columns to $arrData
$arrData += $objRowItem;
}
# Convert this data to CSV
$arrData | ConvertTo-Csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | Out-File .\output.csv
0
solved PowerShell parsing JSON