如何将对象参数作为哈希表传递给 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 .
我的变量在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