You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 21:32:18