Json 在bash中用数组替换键

Json 在bash中用数组替换键,json,bash,jq,Json,Bash,Jq,示例json文件payload.json.tpl: { "foo": "bar", "x": { "y": "${array}" } } 我在bash中有一个数组 array=("one" "two" "three") 如何运行jq命令将键.x.y替换为[“一”、“二”、“三”] 因此,最终的json将是: { "foo": "bar", "x": { "y": ["one", "two", "three"] } } 与此类似,也适用于jq

示例json文件
payload.json.tpl

{
  "foo": "bar",
  "x": {
    "y": "${array}"
  }
}
我在bash中有一个数组

array=("one" "two" "three")
如何运行jq命令将键
.x.y
替换为
[“一”、“二”、“三”]

因此,最终的json将是:

{
  "foo": "bar",
  "x": {
    "y": ["one", "two", "three"]
  }
}

与此类似,也适用于jq<1.6:

< payload.json.tpl jq --arg a "${array[*]}" '.x.y=($a|split(" "))'
注意使用了
${array[*]}
而不是
${array[@]}
。使用
*
时,
${array}
的元素将作为单个字符串而不是多个字符串传递


使用
$ARGS.positional
(需要jq 1.6)


必须注意的是,这对元素本身包含空格的数组不起作用,这是首先在空格分隔的字符串上使用shell数组的主要原因。(尽管您可以使用任何元素中都没有出现的分隔符来构造字符串。)没有使用分隔符来声明数组;这就是重点。将数组转换为绑定到
a
的单个字符串可能会带来问题。(我仍然认为,如果一个人坚持使用较旧版本的
jq
,这个答案是有用的,但缺点仍然需要承认。)是的,我在发表评论后意识到了这一点。谢谢这里的反馈!!
$ array=("one" "two" "three")
$ jq '.x.y = $ARGS.positional' payload.json.tpl --args "${array[@]}"
{
  "foo": "bar",
  "x": {
    "y": [
      "one",
      "two",
      "three"
    ]
  }
}