使用jq遍历JSON删除匹配select筛选条件的对象指定字段
问题原因
你写的代码无法实现原地修改的核心原因是:管道操作..|objects|select(...)会把执行上下文切换为匹配到的单个对象,执行del后只会输出这些修改后的独立对象,原JSON的整体结构会完全丢失。
解决方案
最简写法(推荐)
直接把匹配路径传入del即可,会自动保留原结构删除目标字段:
jq 'del(.. | objects | select(.__typename == "MyType").delete_me)' fixture.json
如果需要直接修改源文件,加上-i参数即可:
jq -i 'del(.. | objects | select(.__typename == "MyType").delete_me)' fixture.json
通用复杂场景写法
如果后续还有其他字段修改逻辑,可以用walk函数递归遍历所有节点处理:
jq 'walk( if type == "object" and .__typename == "MyType" then del(.delete_me) else . end )' fixture.json
walk会遍历JSON的每一个节点,符合判断条件的节点执行修改操作,不符合的原样返回,最终输出完整的修改后结构。
内容的提问来源于stack exchange,提问作者Tristian
相关产品推荐
相关产品推荐

