如何用yq表达式修剪JSON中的无值分支?
用yq递归修剪所有空对象/数组的简洁方案
需求说明
给定稀疏填充的JSON结构(示例如下),需要使用Mike Farah's yq工具,一次性修剪所有空对象、空数组,最终输出仅保留有实际值的节点结构,无需手动根据结构深度重复删除表达式。
输入JSON示例
{ "a": { "b": {}, "c": { "d": { "e": "value", "f": {} } }, "g": 123 }, "h": { "i": [ {}, {"j": "value"} ], "k": "value", "l": { "m": {}, "n": {} } }, "o": { "p": [ {}, {} ], "q": { "r": {}, "s": {} } } }
预期YAML输出
a: c: d: e: value g: 123 h: i: - j: value k: value
当前方案的问题
之前的实现需要重复多次del(.. | select(length == 0))表达式,重复次数取决于输入结构的深度,一旦结构变深就需要手动增加重复次数,无法通用。
简洁通用解决方案
使用yq的until循环,递归删除空结构直到文档中不再存在空对象/数组,无需手动控制重复次数:
完整命令
yq -p=json -o=yaml 'until((.. | select(length == 0) | length) == 0; del(.. | select(length == 0)))' input.json
表达式解释
until(condition; action):循环执行action直到condition满足(.. | select(length == 0) | length) == 0:判断整个文档中是否还有长度为0的结构(空对象/数组),如果没有则停止循环del(.. | select(length == 0)):递归遍历所有节点,删除空对象/数组
该表达式会自动处理任意深度的结构,确保所有空节点都被修剪干净,无需手动调整重复次数。
内容的提问来源于stack exchange,提问作者Graham Hannington
相关产品推荐
相关产品推荐

