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


103

如果我忽略了一些很明显的东西,就可以选择应用程序;我刚刚找到了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示例- 在保留其余JSON的同时,如何使用jqset "local": false

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

Answers:


126

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

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

.shipping.local = false

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

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

10
该样本的正常值不好。因此,如果您需要更改常规值,则需要添加常规值",例如.shipping.local = "new place"。因此整个命令将是curl http://example.com/shipping.json | jq '.shipping.local = "new place"'。否则,您将得到奇怪的错误。
宝马

8
@宝马什么?在这里很好。任何有效的json值都有效,这恰好是文字false。值不必是字符串。
杰夫·梅卡多

OP希望使用@BMW对其进行设置false。怎么了?
SOFe

17

更新值(将.foo.bar设置为“新值”):

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

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

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

我以这个示例为例,通过shell重命名了NPM package.json,它工作了100%,谢谢。
马查多

2
这实际上并不会替换文件的内容。它仅打印到标准输出。您将需要将粗壮文件保存回文件,以使更改保持不变。见stackoverflow.com/a/60744617/1626687
spuder

1

与运算符| =类似的功能是map。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用法中也犯了一些错误,只是认为它确实将“第一个”参数作为程序“读取”,因此,在调用完第一个字符串后,所有所需的命令都应包含在第一个字符串中。程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.