如何将对象参数作为哈希表传递给 json arm 模板?

How do you pass an object parameter into a json arm template as a hashtable?

我的变量在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

我收到以下错误:

Failed to parse JSON: System.Collections.Hashtable

Error Detail: Expecting value: line 1 column 1 (char 0)

我将参数传递到模板的方式或格式化它的方式有问题吗?非常感谢任何帮助。

基于有用的评论:

  • az,Azure CLI,需要 JSON 作为 --parameters 参数,即 JSON string,不是 hashtable.

    • 将哈希表作为参数传递给 外部程序 通常没有意义,因为这样做会发送其 字符串 表示,这是 - 毫无帮助 - 类型名称'System.Collections.Hashtable'
  • 虽然 --parameters (@{ lcr = $lcr } | ConvertTo-Json -Compress) 应该 足以发送哈希表的 JSON 表示,但可悲的现实是,从 PowerShell 7.1 开始,您还需要 \ 转义嵌入的 " 字符 ,因为参数传递给 的一个长期存在的错误外部程序.

    • 最稳健的做法是(如果字符串中没有escaped"-replace '"', '\"'就够了):

      --parameters ((@{ lcr = $lcr } | ConvertTo-Json -Compress) -replace '([\]*)"', '\"')
      
    • 如果您有 JSON 字符串文字或 JSON 字符串存储在变量中,请使用以下命令将其传递给外部程序(如果字符串存储在变量 $var,将 '{ "foo": "bar" }' 替换为 $var):

      someProgram ... ('{ "foo": "bar" }' -replace '([\]*)"', '\"')
      
    • 有关详细信息,请参阅 this answer

因此:

az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters ((@{ lcr = $lcr } | ConvertTo-Json -Compress) -replace '([\]*)"', '\"')

将军ConvertTo-Json pitfall: You may need to use the -Depth parameter for full to-JSON serialization, depending on how deeply nested your object graph is (not needed with your sample input) - see .