【问题标题】:How do you pass an object parameter into a json arm template as a hashtable?如何将对象参数作为哈希表传递给 json arm 模板?
【发布时间】: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/…

标签: json powershell hashtable arm-template azure-cli


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多