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



在powershell中我的变量如下:

$lcr=@{"tierToCool"=@{"daysAfterModificationGreaterThan"=1};"tierToArchive"=@{"daysAfterModificationGreaterThan"=2}}

然后,当我使用az cli命令运行模板时,将变量作为对象传递到我的手臂模板:

az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters lcr=$lcr

我得到以下错误:

解析JSON失败:System.Collections.Hashtable

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

我传递参数到模板的方式或我格式化它的方式有问题吗?如有任何帮助,不胜感激。

基于有用的注释:

  • az, Azure CLI,需要JSON作为--parameters参数,即JSON字符串,而不是散列表

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

    • 最健壮的方法是(如果字符串中没有转义的",-replace '"', '"'就足够了):

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

      someProgram ... ('{ "foo": "bar" }' -replace '([\]*)"', '$1$1"')
      
    • 更多信息请看答案

  • 因此:

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

一个通用的ConvertTo-Json缺陷:你可能需要使用-Depth参数来实现完全到json的序列化,这取决于你的对象图嵌套的深度(你的样本输入不需要)——参见这篇文章。

最新更新