如何将对象参数作为哈希表传递给 json arm 模板?
Posted
技术标签:
【中文标题】如何将对象参数作为哈希表传递给 json arm 模板?【英文标题】:How do you pass an object parameter into a json arm template as a hashtable? 【发布时间】:2021-10-19 13:56:23 【问题描述】:我的变量在 powershell 中如下:
$lcr=@"tierToCool"=@"daysAfterModificationGreaterThan"=1;"tierToArchive"=@"daysAfterModificationGreaterThan"=2
然后,当我使用 az cli 命令运行模板时,将变量作为对象传递到我的 arm 模板中:
az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters lcr=$lcr
我收到以下错误:
解析 JSON 失败:System.Collections.Hashtable
错误详情:预期值:第 1 行第 1 列(字符 0)
我将参数传递到模板的方式或格式化它的方式有问题吗?非常感谢任何帮助。
【问题讨论】:
看起来az
正在等待 JSON。试试... --parameters lcr=$($lcr |ConvertTo-Json)
解析 JSON 失败: 错误详情:需要用双引号括起来的属性名称
--parameters
只需要 JSON - 要么做 --parameters ($lcr|ConvertTo-Json)
要么只是手动将你的哈希表转换为 json 字符串。如果“lcr”也是参数名称,请将其设置为哈希表条目之一,例如$lcr=@'lcr'=@'tierToCool'=...
。查看 az group 部署页面以获取更多示例:docs.microsoft.com/en-us/cli/azure/group/…
【参考方案1】:
以有用的 cmets 为基础:
az
,Azure CLI,需要 JSON 作为 --parameters
参数,即 JSON 字符串,而不是 哈希表 .
'System.Collections.Hashtable'
虽然--parameters (@ lcr = $lcr | ConvertTo-Json -Compress)
应该足以发送您的哈希表的 JSON 表示,但可悲的现实是,从 PowerShell 7.1 开始,您还需要 \
-escape嵌入 "
字符,这是由于参数传递给外部程序的长期存在的错误。
最稳健的方法是(如果字符串中没有转义 "
,-replace '"', '\"'
就足够了):
--parameters ((@ lcr = $lcr | ConvertTo-Json -Compress) -replace '([\\]*)"', '$1$1\"')
如果您有 JSON 字符串文字或 JSON 字符串存储在变量中,请使用以下命令将其传递给外部程序(如果字符串存储在变量 $var
中,请将 ' "foo": "bar" '
替换为 $var
):
someProgram ... (' "foo": "bar" ' -replace '([\\]*)"', '$1$1\"')
更多信息请参见this answer。
因此:
az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters ((@ lcr = $lcr | ConvertTo-Json -Compress) -replace '([\\]*)"', '$1$1\"')
一般的ConvertTo-Json
陷阱:您可能需要使用 -Depth
参数进行完整的 to-JSON 序列化,具体取决于您的对象图的嵌套深度(您的示例输入不需要) - 见this post。
【讨论】:
以上是关于如何将对象参数作为哈希表传递给 json arm 模板?的主要内容,如果未能解决你的问题,请参考以下文章
如何将json字符串传递给webmethod c# ASP.NET
如何将Azure管道变量传递给AzureResourceManagerTemplateDeployment @ 3任务使用的ARM模板?