2017-03-01 91 views
1

它看起來像我期待這個工作沒有。我想要返回多個對象,但它似乎只返回一個。我無法做到這一點。ConvertFrom-JSON到對象

一個非常簡單的JSON文件:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "storageAccountName": { 
     "value": "sa01" 
    }, 
    "virtualNetworkName": { 
     "value": "nvn01" 
    } 
    } 
} 

我想要的參數和它們的值動態添加到一個不錯的pscustomobject(即看起來像上述數據如下):

ParameterName  | Value 
=========================== 
storageAccountName | sa01 
virtualNetworkName | nvn01 

我不明白的是爲什麼以下返回一個對象:

$TemplateParametersFile = "C:\Temp\deploy-Project-Platform.parameters.json" 
$content = Get-Content $TemplateParametersFile -Raw 

$JsonParameters = ConvertFrom-Json -InputObject $content 
$JsonParameters.parameters | Measure-Object 

在寫這篇文章的時候,我最終找到了一個解決方案,得到我想要的,我將在答案部分發布。隨意學校我和改善...

回答

4

我會做一些不同的事情,跳過哈希表,並使用隱藏的PSObject屬性。所以,拿起你必須存儲在$content JSON數據之後,我會做這樣的事情:

#Convert JSON file to an object 
$JsonParameters = ConvertFrom-Json -InputObject $content 

#Create new PSObject with no properties 
$oData = New-Object PSObject 

#Loop through properties of the $JsonParameters.parameters object, and add them to the new blank object 
$JsonParameters.parameters.psobject.Properties.Name | 
    ForEach{ 
     Add-Member -InputObject $oData -NotePropertyName $_ -NotePropertyValue $JsonParameters.parameters.$_.Value 
    } 

$oData 

順便說一句,它有問題,將您發佈的JSON,我不得不添加圍繞這兩個值引號如"value": "sa01"

+0

美麗!如此優雅,當你知道如何!爲什麼它「隱藏」?抱歉缺少引號。我立即改變了null的原始值。仍然習慣於JSON語法。原始問題更新。 – woter324

+0

那麼,PowerShell默認隱藏了很多東西。如果他們向你展示了你一直能夠訪問的所有東西,那將是一種壓倒性的。我相信它是隱藏的,因爲它引用了你的自定義對象的基礎對象,但我可能是錯的,除了我自己的理論,我沒有什麼可以支持的。你應該將'PSObject'管道到'| Get-Member -Force「並瀏覽一下,有很多你可以通過這種方式瞭解你所使用的對象。 – TheMadTechnician

0

使用相同的JSON文件如上圖所示:

<# 
# Read in JSON from file on disk 
$TemplateParametersFile = "C:\Temp\deploy-Project-Platform.parameters.json" 
$content = Get-Content $TemplateParametersFile -Raw 
#> 

#Retrieve JSON file from Azure storage account. 
$TemplateParametersFile = "https://{storageAccountName}.blob.core.windows.net/{SomeContainer}/deploy-Project-Platform.parameters.json" 
$oWc = New-Object System.Net.WebClient 
$webpage = $oWc.DownloadData($TemplateParametersFile) 
$content = [System.Text.Encoding]::ASCII.GetString($webpage) 

#Convert JSON file to an object (IMHO- Sort of!) 
$JsonParameters = ConvertFrom-Json -InputObject $content 

#Build hashtable - easier to add new items - the whole purpose of this script 
$oDataHash = @{} 
$JsonParameters.parameters | Get-Member -MemberType NoteProperty | ForEach-Object{ 
    $oDataHash += @{ 
     $_.name = $JsonParameters.parameters."$($_.name)" | Select -ExpandProperty Value 
    } 
} 

#Example: adding a single item to the hashtable 
$oDataHash.Add("VirtualMachineName","aDemoAdd") 

#Convert hashtable to pscustomobject 
$oData = New-Object -TypeName PSCustomObject 

$oData | Add-Member -MemberType ScriptMethod -Name AddNote -Value { 
    Add-Member -InputObject $this -MemberType NoteProperty -Name $args[0] -Value $args[1] 
} 

$oDataHash.Keys | Sort-Object | ForEach-Object{ 

    $oData.AddNote($_,$oDataHash.$_) 
} 

$oData 

而結果:

storageAccountName VirtualMachineName virtualNetworkName 
------------------ ------------------ ------------------ 
sa01    aDemoAdd   nvn01    

同意,這個問題問一個參數/值對,這導致參數的名稱被指定爲noteproperty,但我認爲這樣更容易使用它。當然,$ oDataHash將它作爲鍵/值對返回。

此腳本還直接從Azure存儲帳戶提取JSON文件。無需保存到磁盤。如果要保存到磁盤,請將$ oWc.DownloadData()更改爲$ oWc。 DownloadFile()。頂部的註釋位從磁盤讀取。

我相信有更簡潔的方法來達到同樣的結果,我很樂意在這裏。對我而言,目前這個工作。