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

标签 json powershell hashtable azure-rm-template azure-cli

我的变量在 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 字符串,而不是哈希表

    • 将哈希表作为参数传递给外部程序通常是没有意义的,因为这样做会发送其字符串表示形式,这毫无帮助 - >类型名称'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\"')
      
    • 请参阅 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 参数进行完整的 JSON 序列化,具体取决于对象图的嵌套深度(不需要)与您的示例输入) - 请参阅 this post

关于json - 如何将对象参数作为哈希表传递到 json arm 模板中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68821054/

相关文章:

node.js - 为什么 Node.js 忽略我的 PowerShell ExecutionPolicy 设置?

正则表达式返回完整行而不是匹配

java - HashTable 父类(super class)作为值

mysql - 如何使用正则表达式在mysql中搜索JSON数据

javascript - 将 HTML 表单字段转换为具有内部对象的 JSON 对象

ios - 如何在 IOS 中将日期格式化为字符串,如 "One Days Ago","Minutes Ago"?

javascript - 定义 "cyclic data structures"

powershell - 将 PowerShell 函数绑定(bind)到参数

Java哈希表或 HashMap ?

Java:如何创建异常哈希表?