JQ如何用变量arg替换整个数组
JQ How to replace entire array with a variable arg
所以我可以做到
jq --arg title "Test" 'select(.title == $title) | .alert.notifications = [{"uid":"foo"},{"uid":"bar"}]' json
输出想要的结果:
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
}
但是,我需要将数组放在一个 var 中并动态提供它,例如:
array='{ "uid": "foo" },{ "uid": "bar"}'
jq -r --arg title "$t" --arg array "$array" 'select(.title == $title) | .alert.notifications = [$array]'
但这会导致出现这种不需要的输出
{
"alert": {
"notifications": [
"{ \"uid\": \"foo\" },{ \"uid\": \"bar\" }"
]
},
"title": "Test"
}
有什么办法可以解决这个问题?非常感谢!!
对 JSON 输入使用 --argjson
(而不是 --arg
)。但是请注意,{"uid": "foo" }, {"uid": "bar"}
本身(还)不是有效的 JSON。您需要将其括在括号中以使其成为一个数组(否则,jq
将(理所当然地)抱怨两个对象之间的逗号多余)。
括号添加到为 --argjson
提供的字符串中:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --argjson array "[$array]" \
'select(.title == $title) | .alert.notifications = $array'
括号添加到名为 array
的 shell 变量:
array='[{"uid": "foo" }, {"uid": "bar"}]'
jq --arg title "$t" --argjson array "$array" \
'select(.title == $title) | .alert.notifications = $array'
另请注意,如果您的输出是 JSON,则不需要 -r
选项。
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
}
如果您没有使用 --argjson
而不是 --arg
的选项(因为,例如,输入可能是也可能不是 JSON,您只能测试它 在 填充变量后),您可以使用 fromjson
内置函数将 JSON-encoded 字符串转换为实际的 JSON (说“测试”不是包含在这些示例中)。
在应用 fromjson
:
之前内联添加的括号
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --arg array "$array" \
'select(.title == $title) | .alert.notifications = ("[\($array)]" | fromjson)'
括号添加到为 --arg
提供的字符串中:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --arg array "[$array]" \
'select(.title == $title) | .alert.notifications = ($array | fromjson)'
括号添加到名为 array
的 shell 变量:
array='[{"uid": "foo" }, {"uid": "bar"}]'
jq --arg title "$t" --arg array "$array" \
'select(.title == $title) | .alert.notifications = ($array | fromjson)'
所以我可以做到
jq --arg title "Test" 'select(.title == $title) | .alert.notifications = [{"uid":"foo"},{"uid":"bar"}]' json
输出想要的结果:
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
}
但是,我需要将数组放在一个 var 中并动态提供它,例如:
array='{ "uid": "foo" },{ "uid": "bar"}'
jq -r --arg title "$t" --arg array "$array" 'select(.title == $title) | .alert.notifications = [$array]'
但这会导致出现这种不需要的输出
{
"alert": {
"notifications": [
"{ \"uid\": \"foo\" },{ \"uid\": \"bar\" }"
]
},
"title": "Test"
}
有什么办法可以解决这个问题?非常感谢!!
对 JSON 输入使用 --argjson
(而不是 --arg
)。但是请注意,{"uid": "foo" }, {"uid": "bar"}
本身(还)不是有效的 JSON。您需要将其括在括号中以使其成为一个数组(否则,jq
将(理所当然地)抱怨两个对象之间的逗号多余)。
括号添加到为 --argjson
提供的字符串中:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --argjson array "[$array]" \
'select(.title == $title) | .alert.notifications = $array'
括号添加到名为 array
的 shell 变量:
array='[{"uid": "foo" }, {"uid": "bar"}]'
jq --arg title "$t" --argjson array "$array" \
'select(.title == $title) | .alert.notifications = $array'
另请注意,如果您的输出是 JSON,则不需要 -r
选项。
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
}
如果您没有使用 --argjson
而不是 --arg
的选项(因为,例如,输入可能是也可能不是 JSON,您只能测试它 在 填充变量后),您可以使用 fromjson
内置函数将 JSON-encoded 字符串转换为实际的 JSON (说“测试”不是包含在这些示例中)。
在应用 fromjson
:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --arg array "$array" \
'select(.title == $title) | .alert.notifications = ("[\($array)]" | fromjson)'
括号添加到为 --arg
提供的字符串中:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --arg array "[$array]" \
'select(.title == $title) | .alert.notifications = ($array | fromjson)'
括号添加到名为 array
的 shell 变量:
array='[{"uid": "foo" }, {"uid": "bar"}]'
jq --arg title "$t" --arg array "$array" \
'select(.title == $title) | .alert.notifications = ($array | fromjson)'