如何用JQ过滤JSON数组并保留原JSON结构?
JQ过滤数组并保留外层JSON结构的解决方案
你当前的命令.policies[] | select(.isEnabled == false)会把policies数组的元素逐个展开输出,自然丢失了原有的数组和外层结构。要保留完整JSON结构,你需要直接更新policies字段的值为过滤后的数组,而不是展开数组元素。
推荐两种简洁的写法:
方法1:使用更新赋值操作符 |= + map 函数
cat myjson.json | jq '.policies |= map(select(.isEnabled == false))'
|= 会直接修改原对象的policies字段,map函数遍历数组每个元素,只保留符合条件的项,这种写法更高效简洁。
方法2:重新赋值数组
cat myjson.json | jq '.policies = [.policies[] | select(.isEnabled == false)]'
这个写法先展开数组过滤元素,再把结果重新包装成数组赋值给policies字段,效果和方法1一致。
示例验证
假设你的原JSON数据是:
{ "name": "系统策略集合", "policies": [ {"id": 1, "name": "策略A", "isEnabled": true}, {"id": 2, "name": "策略B", "isEnabled": false}, {"id": 3, "name": "策略C", "isEnabled": false} ] }
执行上述命令后,输出会保留外层结构,同时只包含isEnabled为false的策略:
{ "name": "系统策略集合", "policies": [ {"id": 2, "name": "策略B", "isEnabled": false}, {"id": 3, "name": "策略C", "isEnabled": false} ] }
内容的提问来源于stack exchange,提问作者girish chalke
相关产品推荐
相关产品推荐

