Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用jq将许多值替换为可变值_Json_Templates_Jq - Fatal编程技术网

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