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

如何优化处理大规模JSON的jq脚本?寻求更高效通用方案

问题

现有如下结构的JSON文档:

{   
      "k1": {
        "i1": 11,
        "i2": 10,
        "b1": {
          "p1": 101,
          "p2": 102,
          "p3": 103
        },
        "b2": {
          "r1": "k1vr1",
          "r2": "k1vr2"
        }   
      },   
      "k2": {
        "i1": 21,
        "i2": 20,
        "b1": {
          "p1": 201,
          "p2": 202,
          "p3": 203
        },
        "b2": {
          "r1": "k2vr1",
          "r2": "k2vr2",
          "r3": "k2vr3"
        }   
       },   
       "k3": {
        "i1": 51,
        "i2": 50,
        "i3": 70,
        "b1": {
          "p1": 301,
          "p2": 302,
          "p3": 303
        },
        "b2": {
          "r1": "k3vr1",
          "r2": "k3vr2",
          "r3": "k3vr3"
        }   
      } 
}

需要使用jq工具生成如下目标输出:

{
  "k2": {
    "b2": {
      "r3": "k2vr3"
    }
  },
  "k3": {
    "i3": 70,
    "b2": {
      "r3": "k3vr3"
    }
  }
}

当前已实现转换的jq脚本为:

map_values(select(.i2 >= 20 and .b1.p2 > 150) | {i3: .i3, b2:{r3: .b2.r3}} | map_values(select(. != null)))

咨询是否存在更高效、更通用的jq脚本实现方案?

优化方案

有更简洁高效且通用的实现方式,推荐使用以下jq脚本:

with_entries(
  select(.value.i2 >= 20 and .value.b1.p2 > 150)
  | .value = (.value | {i3, b2: {r3}} | del(.. | nulls))
)

优势说明

  1. 性能更优:

    • 用with_entries直接操作键值对条目,比map_values少一层无意义的遍历,处理大体积JSON时开销更低;
    • 用del(.. | nulls)一次性递归删除所有层级的null值,替代原脚本中多次调用map_values(select(. != null))的冗余操作,逻辑更紧凑。
  2. 通用性更强:

    • 字段选取采用jq简写语法({i3, b2: {r3}}),等价于原脚本的{i3: .i3, b2: {r3: .b2.r3}},后续添加或修改保留字段时,直接增减字段名即可,维护成本更低;
    • del(.. | nulls)能自动处理任意层级的缺失字段,比如k2没有i3会被自动剔除,无需针对每个字段单独判断null,适配更多复杂结构场景。

脚本拆解

  • with_entries:将顶层对象转换为[{key: "k1", value: {...}}, ...]的键值对数组,处理后再转回对象,方便同时操作键和值;
  • select(...):过滤出符合条件的顶层条目(i2 >=20且b1.p2>150);
  • .value = (...):重构每个条目的value部分,只保留需要的字段;
  • del(.. | nulls):递归遍历所有层级,删除所有null值,自动移除不存在的字段。

内容的提问来源于stack exchange,提问作者kishore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:17:15