2015-06-24 39 views
31

如果我忽视了一些非常明显的事情,我刚刚找到了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": "$" 
    } 
    } 
} 

回答

48

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

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

.shipping.local = false 

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

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

我真的希望你提供了一个完整的例子来显示完整的命令行用法,而不仅仅是示例的部分语法。 :-( – MikeSchinkel

+0

@MikeSchinkel:你的意思是:'curl http:// ... | jq'.shipping.local = false'| curl -X PUT http:// ...'?或者甚至可以:' curl http:// ... | jq --arg prop local'.shipping [$ prop] = false'| curl -X PUT http:// ...'我无法预料每个人的问题,并提供勺子解决方案对于他们中的每一个人,我只能提供构建模块来寻求解决方案。 –

+2

@JeffMercado我只是指一个完整的'jq'命令作为例子,即:'jq'.shipping.local = false'my-data .json'。另外,对于我的评论的语气感到遗憾,重新阅读它,我发现它遇到了侵略性,但这不是我的意图。 – MikeSchinkel