PowerShell解析JSON

PowerShell解析JSON,json,powershell,Json,Powershell,我正在尝试通过PowerShell解析此JSON内容: gc.\release.json |从json转换 release.json将包含以下类似内容: { “来源”:2, “id”:3487, “环境”:[ { “id”:11985, “变量”:{ “Var1”:{“value”:“val1”}, “Var2”:{“value”:“val2”}, “var3”:{“value”:“val3”} } }, { “id”:13797, “变量”:{ “Var1”:{“value”:“val1”}

我正在尝试通过PowerShell解析此JSON内容:

gc.\release.json |从json转换
release.json
将包含以下类似内容:

{
“来源”:2,
“id”:3487,
“环境”:[
{
“id”:11985,
“变量”:{
“Var1”:{“value”:“val1”},
“Var2”:{“value”:“val2”},
“var3”:{“value”:“val3”}
}
},
{
“id”:13797,
“变量”:{
“Var1”:{“value”:“val1”},
“Var2”:{“value”:“val2”},
“var3”:{“value”:“val3”},
“var4”:{“value”:“val4”}
}
}
]
}
要获得如下所示的输出,我可以在每个环境中有许多变量,也可以有多个环境。最终,我需要把它带到Excel并进行分析


如果您想按值名称的行进行分组,那么就不要这么直截了当了。我冒昧地为你考虑了逻辑。以下代码将输出到您需要的csv:

$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
结果:

你的问题是什么?