JQ 如何用变量 arg 替换整个数组

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)

有办法解决这个问题吗?非常感激!!

pmf*_*pmf 5

使用--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)