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)'