如何使用 jq 更新 json 文档中的单个值?

How do I update a single value in a json document using jq?

如果我忽略了一些非常明显的事情,我们深表歉意;我刚刚找到 jq 并试图用它来更新一个 JSON 值而不影响周围的数据。

我想将 curl 结果传送到 jq,更新一个值,然后将更新后的 JSON 传送到 curl -X PUT。像

curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json

到目前为止,我已经使用 sed 将其整合在一起,但在查看了 jq|= 运算符的几个示例后,我确定我不会需要这些。

这是一个 JSON 示例——我如何使用 jq 设置 "local": false,同时保留 JSON 的其余部分?

{
  "shipping": {
    "local": true,
    "us": true,
    "us_rate": {
      "amount": "0.00",
      "currency": "USD",
      "symbol": "$"
    }
  }
}

您使用 = 运算符设置对象的值。另一方面,|= 用于更新值。这是一个微妙但重要的区别。过滤器的上下文发生变化。

由于您要将 属性 设置为常量值,因此请使用 = 运算符。

.shipping.local = false

请注意,将值设置为 属性 时,它不一定必须存在。您可以通过这种方式轻松添加新值。

.shipping.local = false | .shipping.canada = false | .shipping.mexico = true

与运算符 |= 类似的功能是映射。 map 将适用于避免对数组的先前过滤器的要求...

假设您的数据是一个数组(对于这个例子很常见)

[
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  },
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  }
]

因此有必要将代码中的数组视为:

http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json

或者使用专门为每个数组元素工作的映射函数,如

http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json

观察

看在学习者的份上,你在jq的使用上也犯了一些错误,就当是把"read"第一个参数当作程序,所以所有需要的命令都应该包含在调用程序后的第一个字符串。

更新一个值(将 .foo.bar 设置为 "new value"):

jq '.foo.bar = "new value"' file.json

使用变量更新值(将 .foo.bar 设置为 "hello"):

variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json