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

如果我忽略了一些非常明显的事情,那么我向您道歉; 我刚刚发现了 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": "$"
}
}
}
136127 次浏览

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

因为要将属性设置为常数值,所以使用 =运算符。

.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

或者使用在每个数组元素中工作的 map 函数作为

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

观察

对于那些正在学习的人来说,您在使用 jq 时也犯了一些错误,只要考虑到它确实“读取”了程序的第一个参数,因此所有需要的命令都应该包含在调用程序之后的第一个字符串中。

更新一个值(将.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