将键/值添加到 json 对象

jes*_*e_b 15 json jq

我有一个 json 对象存储在 shell 变量中json

{
    "name": "foo",
    "array": [
        {
            "name": "bar",
            "thing": true
        },
        {
            "name": "baz",
            "thing": false
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想new_key向 中的两个对象添加一个新键(让我们称之为 )array。我可以执行以下操作:

$ jq '.array[] + {"new_key": 0}' <<<"$json"
{
  "name": "bar",
  "thing": true,
  "new_key": 0
}
{
  "name": "baz",
  "thing": false,
  "new_key": 0
}
Run Code Online (Sandbox Code Playgroud)

但是,这只返回数组数组,而不返回整个对象。我怎样才能就地修改变量或返回整个对象?

Kus*_*nda 24

$ jq '.array[] += { new_key: 0 }' <<<"$json"
{
  "name": "foo",
  "array": [
    {
      "name": "bar",
      "thing": true,
      "new_key": 0
    },
    {
      "name": "baz",
      "thing": false,
      "new_key": 0
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

也就是说,使用+=代替+. 您想要修改数组,而不是提取它并向其中添加。

或者,如果您想对表达式中的键进行硬编码,jq请在命令行上传递值:

jq --argjson newval "$somevalue" '.array[] += { new_key: $newval }' <<<"$json"
Run Code Online (Sandbox Code Playgroud)

或者更简洁,使用$ARGS.named

jq --argjson new_key "$somevalue" '.array[] += $ARGS.named' <<<"$json"
Run Code Online (Sandbox Code Playgroud)

如果您添加的值是字符串,则更改为--argjsonjust 。--arg