2017-08-29 205 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