2017-08-29 55 views
-3

我试图通过解析PowerShell中JSON内容:PowerShell中解析JSON

gc .\release.json | ConvertFrom-Json 

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" } 
     } 
    } 
    ] 
} 

为了得到像下面的输出,我可以有很多变量在每个环境中可以有多个环境。最终,我需要把它带到Excel和分析。

Enter image description here

+4

什么是你的问题? –

+0

为什么会有vsts-release标记? –

+0

@ D.J。 Json是VSTS的导出版本定义 –

回答

1

如果你不通过价值名行要组直线前进。我冒昧地为你思考逻辑。下面的代码将输出到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 

结果: enter image description here