如何用jq命令替换JSON值?

时间:2019-09-05 07:52:42

标签: json bash jq

我有这个json文件:

{
    "orders": "[{\"items\":[{\"itemid\":'',\"quantity\":'',\"price\":'',\"currency\":\"IDR\",\"shopid\":'',\"item_group_id\":null,\"add_on_deal_id\":null,\"checkout\":true}],\"shopid\":''}]",
    "check_voucher_payment_criteria": false,
    "need_wallet_active_info": false
}

我要替换:

  1. itemid,其值为321
  2. quantity,其值为1
  3. price,其值为100000
  4. shopid,其值为789

所以我想要的结果是:

{
    "orders": "[{\"items\":[{\"itemid\":321,\"quantity\":1,\"price\":100000,\"currency\":\"IDR\",\"shopid\":789,\"item_group_id\":null,\"add_on_deal_id\":null,\"checkout\":true}],\"shopid\":789}]",
    "check_voucher_payment_criteria": false,
    "need_wallet_active_info": false
}

我尝试了https://jqplay.org/s/x3IArefkyH

jq --raw-output '.orders[].items = 321' file.json

但这给了我这个错误:

jq: error (at <stdin>:4): Cannot iterate over string ("[{\"items\...)
exit status 5

我应该如何解决?

3 个答案:

答案 0 :(得分:1)

为了让jq理解orders元素内的json字符串,您必须用反斜杠双引号{{1}替换json文件中的单引号'。 }。

然后,您可以使用\"通过将json字符串转换为object然后再转换为string来替换所需的值:

jq

答案 1 :(得分:1)

这里的复杂之处在于您的字符串化JSON没有正确地字符串化。一种选择是使其成为有效的字符串化JSON,执行更新,然后再次对其进行字符串化。 在该示例中,所有出现的''都被JSON值替换,因此最后一步(重新字符串化)是否正常完成(使用tojson)都没有关系,因此在下面,仅执行常规字符串化。

.orders |= (gsub("''";"\"\"") | fromjson)
| .orders[0].items[0] |= (.itemid = 321 | .quantity=1 | .price = 100000 | .shopid = 789)
| .orders[0].shopid = 789
| .orders |= tojson

第一个gsub是否应显示为 (gsub("'";"\"")或其他因素将取决于产生和消耗该糊状物的过程。

答案 2 :(得分:0)

您将订单值设置为字符串。这就是您无法循环浏览的原因。如下所示协助订单时,请删除双引号

 {
    "orders": [{"items":[{"itemid":"","quantity":"","price":"","currency":"IDR","shopid":"","item_group_id":null,"add_on_deal_id":null,"checkout":true}],"shopid":""}],
    "check_voucher_payment_criteria": false,
    "need_wallet_active_info": false
}

输出

enter image description here