如何使用 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
如果我忽略了一些非常明显的事情,我们深表歉意;我刚刚找到 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