从JSON到对象的转换
看起来我期望的工作方式不起作用。我希望返回多个对象,但它似乎只返回一个。我不知道该怎么做 一个非常简单的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"
{
"$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