我有这个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
}
我要替换:
itemid
,其值为321
quantity
,其值为1
price
,其值为100000
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
我应该如何解决?
答案 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)