2017-03-01 2 views
1

마치 작동하도록 기대하는 것처럼 보입니다. 여러 객체가 반환되기를 원하지만 하나만 반환하는 것으로 보입니다. 내가하는 일은 내가 할 수없는 일이다.ConvertFrom-JSON을 객체로

아주 간단한 JSON 파일 :

나는 동적으로 (즉, 위의 데이터를 다음과 같을 것이다) 멋진 pscustomobject에 매개 변수와 그 값을 추가 할
{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "storageAccountName": { 
     "value": "sa01" 
    }, 
    "virtualNetworkName": { 
     "value": "nvn01" 
    } 
    } 
} 

:

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 

:

내가 이해할 수없는 것은 왜 다음 반환 한 개체입니다 이 글을 쓰는 동안 필자는 필자가 원하는 바를 얻는 해결책을 찾았습니다. 답변 섹션에 게시하겠습니다.

<# 
# 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 

그리고 결과 : 위의 그림과 같이 같은 JSON 파일을 사용하여 ...

답변

4

해시 테이블을 건너 뛰고 숨겨진 PSObject 속성을 사용하여 조금 다르게 작업 할 것입니다. 그래서, 당신은 $content에 저장된 JSON 데이터가 후 따기, 나는 이런 식으로 뭔가 할 것입니다 : 당신이 게시 된 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 

을, 나는 두 값 따옴표를 추가했다 예 : "value": "sa01".

+0

아름다운! 어떻게하면 알 수 있을까요? 왜 "숨겨진"것입니까? 누락 된 인용문에 대해 죄송합니다. 나는 원래의 null 값을 변경했다. 여전히 JSON 구문에 익숙해졌습니다. 원래 질문으로 업데이트되었습니다. – woter324

+0

글쎄, PowerShell은 기본적으로 많은 것을 숨 깁니다. 그들이 당신에게 당신이 항상 접근 할 수있는 모든 것을 보여 주었다면 그것은 압도적이었을 것입니다. 나는 그것이 당신의 커스텀 객체가 파생 된 기본 객체를 참조하기 때문에 숨겨져 있다고 믿는다. 그러나 틀릴 수도있다. 'PSObject'를'| '로 파이프해야합니다. Get-Member -Force'를 방문하고 주변을 둘러 보면, 당신이 그 방법으로 작업하는 객체에 대해 많은 것을 배울 수 있습니다. – TheMadTechnician

0

날 학교에 자유롭게 향상

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

이 합의, 문제는 매개 변수를 요청/값 쌍을 사용하면 매개 변수의 이름이 noteproperty로 할당되지만,이 방법을 사용하는 것이 더 쉬울 것이라고 생각합니다. 물론 $ oDataHash는이를 키/값 쌍으로 반환합니다.

또한이 스크립트는 Azure 저장소 계정에서 JSON 파일을 직접 가져옵니다. 디스크에 저장할 필요가 없습니다. 디스크에 저장하려면 $ oWc.DownloadData()를 $ oWc로 변경하십시오. DownloadFile(). 상단의 주석 처리 된 비트는 디스크에서 읽습니다.

동일한 결과를 얻는 훨씬 더 간결한 방법이있을 것이라고 확신합니다. 나를 위해,이 순간에 작동합니다.