PowerShell 解析 JSON

Shi*_*uel -3 powershell json

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

gc .\release.json |  ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)

release.json将有类似的内容如下:

{
  "source": 2,
  "id": 3487,
  "environments": [
    {
      "id": 11985,
      "variables": {
        "Var1": { "value": "val1" },
        "Var2": { "value": "val2" },
        "var3": { "value": "val3" }
      }
    },
    {
      "id": 13797,
      "variables": {
        "Var1": { "value": "val1" },
        "Var2": { "value": "val2" },
        "var3": { "value": "val3" },
        "var4": { "value": "val4" }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

为了获得如下所示的输出,我可以在每个环境中拥有许多变量,并且可以拥有多个环境。最终我需要将其导入 Excel 并进行分析。

在此输入图像描述

小智 5

如果您想按值名称行进行分组,则不是那么简单。我冒昧地为你思考了逻辑。下面的代码会将您需要的内容输出到 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
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述