如何用jq过滤嵌套JSON中cycle为null的对象并保留结构
解决方法
要保留原有层级结构并移除cycle == null的子对象,核心是在原JSON结构上进行过滤更新,而不是直接提取符合条件的元素。以下是针对不同结构场景的jq命令:
场景1:顶层对象的子属性是数组
如果你的JSON结构是顶层对象,每个属性对应一个数组,数组元素是包含cycle字段的对象(比如下面的示例):
{ "groupA": [ {"name": "foo", "cycle": 1}, {"name": "bar", "cycle": null}, {"name": "baz", "cycle": 3} ], "groupB": [ {"name": "qux", "cycle": null}, {"name": "quux", "cycle": 2} ] }
使用以下jq命令:
jq 'map_values(map(select(.cycle != null)))' input.json
map_values:遍历顶层对象的每个属性值,对其执行后续操作map(select(...)):对数组中的每个元素筛选,保留cycle不为null的条目
输出会保留原有的顶层分组结构,仅过滤掉不符合条件的数组元素。
场景2:顶层对象的子属性是嵌套对象
如果第二层是键值对形式的对象(而非数组):
{ "groupX": { "item1": {"id": 1, "cycle": null}, "item2": {"id": 2, "cycle": 4}, "item3": {"id": 3, "cycle": 5} }, "groupY": { "itemA": {"id": 4, "cycle": 6}, "itemB": {"id": 5, "cycle": null} } }
使用以下jq命令:
jq 'map_values(map_values(select(.cycle != null)))' input.json
- 多一层
map_values用于遍历第二层对象的每个子属性,完成筛选。
场景3:混合结构(数组+嵌套对象)
如果顶层的子属性既有数组又有对象,可以用条件判断兼容两种情况:
jq 'map_values( if type == "array" then map(select(.cycle != null)) elif type == "object" then map_values(select(.cycle != null)) else . end )' input.json
该命令会自动识别第二层的类型,分别执行对应的过滤逻辑,同时保留原层级结构。
内容的提问来源于stack exchange,提问作者Arne
相关产品推荐
相关产品推荐

