[Solved] PowerShell parsing JSON


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

result:
enter image description here

0

solved PowerShell parsing JSON