Json 使用jq将许多值替换为可变值
使用Json 使用jq将许多值替换为可变值,json,templates,jq,Json,Templates,Jq,使用jq,是否可以用作为初始值的变量值替换示例JSON中每个参数的值 在我的场景中,Azure DevOps不会对JSON文件执行任何类型的变量替换,因此我需要手动执行。例如,假设$SUBSCRIPTION\u ID设置为abc-123,我想使用jq来更新JSON文件 我可以使用.parameters[].value提取值,但似乎找不到设置每个值的方法 这里的主要挑战是解决方案应该是可重用的,不同的JSON文件将具有不同的参数,因此我认为我不能使用--argjson 例子 原始JSON 变量 所
jq
,是否可以用作为初始值的变量值替换示例JSON中每个参数的值
在我的场景中,Azure DevOps不会对JSON文件执行任何类型的变量替换,因此我需要手动执行。例如,假设$SUBSCRIPTION\u ID
设置为abc-123
,我想使用jq
来更新JSON文件
我可以使用.parameters[].value
提取值,但似乎找不到设置每个值的方法
这里的主要挑战是解决方案应该是可重用的,不同的JSON文件将具有不同的参数
,因此我认为我不能使用--argjson
例子
原始JSON
变量
所需的JSON
使用--argjson
;本质上,您将忽略参数化JSON的尝试,而只是无条件地替换这些值
jq --argjson x "$SUBSCRIPTION_ID" \
--argjson y "$TOPIC_NAME" \
'.parameters.subscriptionId.value = $x; .parameters.topicName.value = $y' \
config.json
导出这些变量,以便可以从jq中访问它们
export SUBSCRIPTION_ID TOPIC_NAME
jq '.parameters[].value|=(env[.[1:]]//.)' file
/。
部分用于保留环境中不存在的变量,如果没有必要,可以删除它。以下是一种基于模式内容和可用环境变量的“数据驱动”方法:
export SUBSCRIPTION_ID="abc-123"
export TOPIC_NAME="SomeTopic"
< schema.json jq '.parameters
|= map_values(if .value | (startswith("$") and env[.[1:]])
then .value |= env[.[1:]] else . end)'
警告
使用环境变量传递参数值可能不是一个好主意。两种选择是在文本文件中或作为JSON对象提供名称-值对。另请参见谢谢您的回复。但这里的问题是,我需要可重用的解决方案,并且不是每个JSON文件(所有ARM模板参数文件)都是相同的,因此我无法硬编码参数名称。这很好,谢谢。Azure DevOps可以直接导出变量,这样就不需要在任务中指定任何内容(这是我无法使用建议的答案
--argjson
)。
jq --argjson x "$SUBSCRIPTION_ID" \
--argjson y "$TOPIC_NAME" \
'.parameters.subscriptionId.value = $x; .parameters.topicName.value = $y' \
config.json
export SUBSCRIPTION_ID TOPIC_NAME
jq '.parameters[].value|=(env[.[1:]]//.)' file
export SUBSCRIPTION_ID="abc-123"
export TOPIC_NAME="SomeTopic"
< schema.json jq '.parameters
|= map_values(if .value | (startswith("$") and env[.[1:]])
then .value |= env[.[1:]] else . end)'
SUBSCRIPTION_ID="abc-123" TOPIC_NAME="SomeTopic" jq -f program.jq schema.json