从JSON到对象的转换

从JSON到对象的转换,json,powershell,azure,Json,Powershell,Azure,看起来我期望的工作方式不起作用。我希望返回多个对象,但它似乎只返回一个。我不知道该怎么做 一个非常简单的JSON文件: { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "storageAccountName": { "value"

看起来我期望的工作方式不起作用。我希望返回多个对象,但它似乎只返回一个。我不知道该怎么做

一个非常简单的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中(上面的数据如下所示):

我不明白的是,为什么下面返回一个对象:

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

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

在写这篇文章的时候,我最终找到了一个解决方案,它就是我想要的,我将在答案部分发布。请随意教我,提高我的

使用如上所示的相同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
同意,问题要求一个参数/值对,这导致参数的名称被指定为noteproperty,但我认为这样使用会更容易。当然,$oDataHash将其作为键/值对返回

此脚本还直接从Azure存储帐户提取JSON文件。无需保存到磁盘。如果要保存到磁盘,请将$oWc.DownloadData()更改为$oWc。顶部的注释位从磁盘读取


我相信有很多更简洁的方法可以达到同样的效果,我很乐意在这里介绍它们。对我来说,目前这是可行的。

我会做一些不同的事情,跳过哈希表,使用hidden
PSObject
属性。因此,在您将JSON数据存储在
$content
中之后,我会这样做:

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

漂亮!当你知道怎么做的时候,那么优雅!为什么它是“隐藏的”?很抱歉遗漏了报价。我动态更改了null的原始值。仍然习惯JSON语法。更新了原始问题。好吧,PowerShell默认隐藏了很多东西。如果他们一直向你展示你能接触到的一切,那将是一种压倒一切的感觉。我相信它是隐藏的,因为它引用了自定义对象派生自的基本对象,但是我可能错了,我没有什么可以支持的,只有我自己的理论。你应该通过管道将
PSObject
连接到
| Get Member-Force
并浏览一下,你可以通过这种方式了解很多关于你使用的对象的信息。
storageAccountName VirtualMachineName virtualNetworkName
------------------ ------------------ ------------------
sa01               aDemoAdd           nvn01             
#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