如何使用 jq 命令向 JSON 对象添加字段?

Joe*_*Joe 9 json jq

我有这个 JSON 数据:

{
    "success": true,
    "module": {
        "data": {
            "item_i77f664a2": {
                "id": "i77f664a2",
                "tag": "item",
                "fields": {
                    "cartItemId": 2012636322
                },
                "type": "biz"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在{"operation":"delete"}下面添加cartItemId,然后将 JSON 数据保存到文件中。我想要的结果是这样的:

{
    "success": true,
    "module": {
        "data": {
            "item_i77f664a2": {
                "id": "i77f664a2",
                "tag": "item",
                "fields": {
                    "cartItemId": 2012636322,
                    "operation": "delete"
                },
                "type": "biz"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

jq '.module.data.item_i77f664a2.fields + {"operation":"delete"}' > data.json
Run Code Online (Sandbox Code Playgroud)

但它不会像上面那样保存带有我想要的输出的 JSON 数据。我如何解决它 ?

pea*_*eak 18

这种类型的更新是魔法+=发挥作用的地方。根据您的输入,以下调用:

jq '.module.data.item_i77f664a2.fields += {"operation":"delete"}'
Run Code Online (Sandbox Code Playgroud)

产生你想要的输出:

{
  "success": true,
  "module": {
    "data": {
      "item_i77f664a2": {
        "id": "i77f664a2",
        "tag": "item",
        "fields": {
          "cartItemId": 2012636322,
          "operation": "delete"
        },
        "type": "biz"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这会在类似情况下产生您想要的结果,因为您已经引用了“item_i77f61ee2”。


Pie*_*rre 8

感谢@peak的回答!

只是想补充一下,

创建一个空白的 json 文件:

echo "{}" > config.json
Run Code Online (Sandbox Code Playgroud)

文件内容:

{}
Run Code Online (Sandbox Code Playgroud)

然后向文件添加属性:

echo "$(jq '. += {"url": "https://url.com"}' config.json)" > config.json
Run Code Online (Sandbox Code Playgroud)

文件内容:

{
    "url": "https://url.com"
}
Run Code Online (Sandbox Code Playgroud)

又一属性:

echo "$(jq '. += {"name": "a Name"}' config.json)" > config.json
Run Code Online (Sandbox Code Playgroud)

文件内容:

{
    "url": "https://url.com",
    "name": "a Name"
}
Run Code Online (Sandbox Code Playgroud)

如果您设置了变量并想要使用该值(即Azure Build Pipelines),您可以将该值作为参数传递(urlarg在本例中):

URL="https://url.com"
echo "$(jq --arg urlarg "$URL" '. += {"url": $urlarg}' config.json)" > config.json
Run Code Online (Sandbox Code Playgroud)