如何优化处理大规模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)) )
优势说明
性能更优:
- 用
with_entries直接操作键值对条目,比map_values少一层无意义的遍历,处理大体积JSON时开销更低; - 用
del(.. | nulls)一次性递归删除所有层级的null值,替代原脚本中多次调用map_values(select(. != null))的冗余操作,逻辑更紧凑。
- 用
通用性更强:
- 字段选取采用jq简写语法(
{i3, b2: {r3}}),等价于原脚本的{i3: .i3, b2: {r3: .b2.r3}},后续添加或修改保留字段时,直接增减字段名即可,维护成本更低; del(.. | nulls)能自动处理任意层级的缺失字段,比如k2没有i3会被自动剔除,无需针对每个字段单独判断null,适配更多复杂结构场景。
- 字段选取采用jq简写语法(
脚本拆解
with_entries:将顶层对象转换为[{key: "k1", value: {...}}, ...]的键值对数组,处理后再转回对象,方便同时操作键和值;select(...):过滤出符合条件的顶层条目(i2 >=20且b1.p2>150);.value = (...):重构每个条目的value部分,只保留需要的字段;del(.. | nulls):递归遍历所有层级,删除所有null值,自动移除不存在的字段。
内容的提问来源于stack exchange,提问作者kishore
相关产品推荐
相关产品推荐

