2015-06-24 43 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