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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:25:00