如何将对象参数作为哈希表传递给 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 模板?的主要内容,如果未能解决你的问题,请参考以下文章

Twig 将参数作为 JSON 传递给 JS

如何将json字符串传递给webmethod c# ASP.NET

将对象作为参数传递给函数

如何将Azure管道变量传递给AzureResourceManagerTemplateDeployment @ 3任务使用的ARM模板?

如何使用 MVC Web Api GET 将对象作为参数传递

在 MVC 5 中,如何将表对象数据作为列表传递给控制器​​视图模型?