如何用JQ修改过滤得到的对象同时保留JSON原有完整结构
问题原因
你原有语句的问题在于使用|管道运算符直接提取了.myValues字段单独处理,执行完成后只会输出修改后的匹配元素,外层的完整JSON结构就丢失了。
解决方案
1. 修改所有满足条件的元素
使用括号包裹定位路径,直接对匹配元素赋值即可保留完整结构,命令如下:
jq '(.myValues[] | select(.filterableValue == "y")) += {"this": "has been added"}'
也可以用更简洁的写法:
jq '(.myValues[] | select(.filterableValue == "y")).this = "has been added"'
2. 仅修改首个满足条件的元素
如果只需要给第一个匹配的元素新增键值对,可以用first函数定位:
jq '(.myValues | first(.[] | select(.filterableValue == "y"))).this = "has been added"'
说明
上述写法只会修改你定位到的匹配元素,其余所有字段(包括外层的foo字段、myValues数组里不匹配的元素)都会原封不动保留,输出结果和你给出的预期结构完全一致。
内容的提问来源于stack exchange,提问作者koks der drache
相关产品推荐
相关产品推荐

