2017-03-01 7 views
1

これは動作しないと思われます。私は複数のオブジェクトを返すようにしたいが、それはただ1つだけ戻っているようだ。私がそれをやる方法は私を超えています。From-JSONからオブジェクトへの変換

非常に単純なJSONファイル:

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

{ 
    "$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(つまり、上記のデータを次のようになります)にパラメータとその値を追加したいです

私が理解できないのは、以下のオブジェクトが1つのオブジェクトを返す理由です。

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

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

これを書いている間に、私は最終的に私が欲しいものを得る解決策を見つけました。答えのセクションに投稿します。学校私にお気軽にして上記のように同じJSONファイルを使用して...

答えて

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に変換する問題があったが、私は2つの値の前後に引用符を追加する必要がありました例えば、"value": "sa01"

+0

美しい!どのように知っているので、エレガント!なぜそれは隠されていますか?不足している引用については申し訳ありません。私はその場でヌルの元の値を変更しました。 JSON構文に慣れています。元の質問で更新されました。 – woter324

+0

さて、PowerShellはデフォルトで多くのことを隠しています。彼らがあなたにすべての時間を提供してくれれば、それは圧倒的なものになるでしょう。私はそれがあなたのカスタムオブジェクトが由来するベースオブジェクトを参照するので隠されていると信じていますが、私は間違っているかもしれません。 'PSObject'を' | 'にパイプする必要があります。 Get-Member -Force'を参照してください。その周りを少しブラウズすると、その方法で作業するオブジェクトについて多くのことを学ぶことができます。 – TheMadTechnician

0

を改善:

<# 
# 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()。上のコメントされたビットは、ディスクから読み込みます。

私は同じ結果を達成するためにはるかに簡潔な方法があると確信しています。私のために、これは今のところ動作します。

関連する問題