ConvertFrom-JSON到object

时间:2017-03-01 18:50:26

标签: json powershell azure

看起来我希望这种工作的方式不会。我想要返回多个对象,但它似乎只返回一个。我不知道如何做到这一点。

一个非常简单的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

在写这篇文章的同时,我最终找到了一个能够得到我想要的解决方案,我将在答案部分发布。随意上学,改进......

2 个答案:

答案 0 :(得分:6)

我会做一些不同的事情,跳过哈希表,并使用隐藏的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"

答案 1 :(得分:1)

使用如上所示的相同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()。顶部的注释位从磁盘读取。

我确信有更简洁的方法可以达到相同的效果,我很乐意在这里。对我来说,目前这是有效的。