Nic*_*eld 6 variables json arguments jq
所以我可以这样做
jq --arg title "Test" 'select(.title == $title) | .alert.notifications = [{"uid":"foo"},{"uid":"bar"}]' json
Run Code Online (Sandbox Code Playgroud)
输出所需的结果:
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
}
Run Code Online (Sandbox Code Playgroud)
但是,我需要将数组放入 var 中并动态提供它,例如:
array='{ "uid": "foo" },{ "uid": "bar"}'
jq -r --arg title "$t" --arg array "$array" 'select(.title == $title) | .alert.notifications = [$array]'
Run Code Online (Sandbox Code Playgroud)
但这会导致这种不期望的输出
{
"alert": {
"notifications": [
"{ \"uid\": \"foo\" },{ \"uid\": \"bar\" }"
]
},
"title": "Test"
}
Run Code Online (Sandbox Code Playgroud)
有办法解决这个问题吗?非常感激!!
使用--argjson( 而不是--arg) 作为 JSON 输入。但请注意,{"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'
Run Code Online (Sandbox Code Playgroud)
添加到名为 的 shell 变量中的括号array:
array='[{"uid": "foo" }, {"uid": "bar"}]'
jq --arg title "$t" --argjson array "$array" \
'select(.title == $title) | .alert.notifications = $array'
Run Code Online (Sandbox Code Playgroud)
另请注意,如果您的输出是 JSON,则不需要该-r选项。
{
"alert": {
"notifications": [
{
"uid": "foo"
},
{
"uid": "bar"
}
]
},
"title": "Test"
}
Run Code Online (Sandbox Code Playgroud)
如果您没有使用--argjson替代的选项--arg(例如,因为输入可能是也可能不是 JSON,并且您只能在填充变量后fromjson对其进行测试),您可以使用内置函数来转换 JSON 编码的字符串转换为实际的 JSON(所说的“测试”不包含在这些示例中)。
在应用之前内嵌添加括号fromjson:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --arg array "$array" \
'select(.title == $title) | .alert.notifications = ("[\($array)]" | fromjson)'
Run Code Online (Sandbox Code Playgroud)
添加到为 提供的字符串的括号--arg:
array='{"uid": "foo" }, {"uid": "bar"}'
jq --arg title "$t" --arg array "[$array]" \
'select(.title == $title) | .alert.notifications = ($array | fromjson)'
Run Code Online (Sandbox Code Playgroud)
添加到名为 的 shell 变量中的括号array:
array='[{"uid": "foo" }, {"uid": "bar"}]'
jq --arg title "$t" --arg array "$array" \
'select(.title == $title) | .alert.notifications = ($array | fromjson)'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |