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

求助:如何使用jq递归删除JSON树中所有指定键值对

如何用jq递归删除JSON中所有层级的指定键值对

我明白你遇到的问题了——处理深层嵌套的大JSON文件时,直接遍历顶层结构不仅会漏掉嵌套的节点,还会因为数组和对象的处理逻辑不一致导致索引错误。针对你的需求(删除所有层级中type:"Link"和linkType:"Entry"这两个键值对),我们可以用jq的walk函数来递归遍历整个JSON结构,精准处理每个节点。

解决方案命令

直接使用以下jq命令即可完成需求:

walk(
  if type == "object" then
    del(
      .type | select(. == "Link"),
      .linkType | select(. == "Entry")
    )
  elif type == "array" then
    map(walk(.))
  else
    .
  end
)

命令解释

让我拆解一下这个命令的逻辑,帮你理解为什么它能解决你的问题:

  1. walk函数:这是jq中专门用来递归遍历JSON所有节点的工具,它会深入到每一层嵌套的对象和数组中,确保我们不会漏掉任何需要处理的键值对。
  2. 对象节点处理:当遍历到对象时,我们用del()结合select(),只删除符合条件的键:
    • 仅当type的值为"Link"时,删除这个type键
    • 仅当linkType的值为"Entry"时,删除这个linkType键
  3. 数组节点处理:当遍历到数组时,我们用map(walk(.))递归处理数组中的每一个元素,避免跳过数组内部嵌套的对象。
  4. 其他类型节点:对于字符串、数字等非对象/数组类型,直接返回原内容,不做修改。

针对大文件的使用建议

你的JSON文件有80万行且嵌套较深,这个命令在内存允许的情况下可以高效处理。如果担心内存占用,你可以直接在命令行执行(无需保存到文件),并将结果输出到新文件:

jq 'walk(if type == "object" then del(.type | select(. == "Link"), .linkType | select(. == "Entry")) elif type == "array" then map(walk(.)) else . end)' your-large-file.json > cleaned-file.json

为什么你之前的命令会报错?

你尝试的[ .[] | select(.linkType != "Entry", .type != "Link" ) ]命令有两个问题:

  • 它只遍历了JSON的顶层结构,完全没有处理嵌套的层级
  • 当遍历到数组时,你直接尝试访问.linkType这个字符串键,但数组是通过数字索引访问的,所以会出现Cannot index array with string的错误

而我们的方案用walk自动区分对象和数组,分别处理,完美避免了这个问题。

验证示例

用你提供的JSON片段测试这个命令,会得到你期望的结果:

输入片段:

{
  "entries": [
    {
      "sys": {
        "id": "vcLKKhJ3mZNfGMvVZZi07",
        "contentType": {
          "sys": {
            "id": "page"
          }
        }
      },
      "fields": {
        "title": {
          "de-DE": "Startseite",
          "en-US": "Home"
        },
        "description": {
          "en-US": "foo"
        },
        "keywords": {
          "en-US": "bar"
        },
        "stageModules": {
          "en-US": [
            {
              "sys": {
                "type": "Link",
                "linkType": "Entry",
                "id": "11AfBBuNK8bx3EygAS3WTY"
              }
            }
          ]
        }
      }
    }
  ]
}

输出结果:

{
  "entries": [
    {
      "sys": {
        "id": "vcLKKhJ3mZNfGMvVZZi07",
        "contentType": {
          "sys": {
            "id": "page"
          }
        }
      },
      "fields": {
        "title": {
          "de-DE": "Startseite",
          "en-US": "Home"
        },
        "description": {
          "en-US": "foo"
        },
        "keywords": {
          "en-US": "bar"
        },
        "stageModules": {
          "en-US": [
            {
              "sys": {
                "id": "11AfBBuNK8bx3EygAS3WTY"
              }
            }
          ]
        }
      }
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:42:37