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

如何基于键值对从嵌套JSON对象/字典中移除指定层级?

问题描述

我有一个大型嵌套JSON文件,需要移除其中特定层级。示例原始结构如下:

{
  "children": [
    {
      "name": "FirstLayer 1",
      "type": "Folder",
      "children": [
        {
          "name": "ID12345",
          "type": "Folder",
          "children": [
            {
              "key1": "abc",
              "key3": "Float8"
            },
            {
              "key2": "abc",
              "key4": "Float8"
            }
          ]
        }
      ]
    },
    {
      "name": "FirstLayer",
      "type": "Folder",
      "children": [
        {
          "name": "ID98765",
          "type": "Folder",
          "children": [
            {
              "key1": "abc",
              "key3": "Float8"
            },
            {
              "key2": "abc",
              "key4": "Float8"
            }
          ]
        }
      ]
    }
  ]
}

需要移除所有名称为ID12345、ID98765的层级(包含其下属全部内容),最终期望结构如下:

{
  "children": [
    {
      "name": "FirstLayer 1",
      "type": "Folder",
      "children": [
          {
            "key1": "abc",
            "key3": "Float8"
          },
          {
            "key2": "abc",
            "key4": "Float8"
          }
      ]
    },
    {
      "name": "FirstLayer",
      "type": "Folder",
      "children": [
          {
            "key1": "abc",
            "key3": "Float8"
          },
          {
            "key2": "abc",
            "key4": "Float8"
          }
      ]
    }
  ]
}

dict.pop()只能按键名操作,无法基于键值匹配移除整个层级,也没法处理关联的type和children字段,所以需要找基于键值操作的方法,或者自定义函数实现,优先用Python,也接受其他方式。

Python解决方案

针对嵌套JSON的结构,自定义递归函数是最直接的方案,能深度遍历并处理每一层级。核心逻辑:遍历每个节点,若节点是包含children的文件夹,检查其子节点——如果子节点的name属于要移除的ID列表,就用该子节点的children替换原位置的节点;否则继续递归处理子节点。

代码实现

import json

def remove_id_layers(data, target_ids):
    # 处理列表类型节点
    if isinstance(data, list):
        processed_items = []
        for item in data:
            child_result = remove_id_layers(item, target_ids)
            # 匹配到目标ID节点时,提取其children替代原节点
            if isinstance(child_result, dict) and child_result.get('name') in target_ids:
                processed_items.extend(remove_id_layers(child_result.get('children', []), target_ids))
            else:
                processed_items.append(child_result)
        return processed_items
    # 处理字典类型节点
    elif isinstance(data, dict):
        processed_dict = {}
        for key, value in data.items():
            if key == 'children':
                processed_dict[key] = remove_id_layers(value, target_ids)
            else:
                processed_dict[key] = value
        return processed_dict
    # 非容器类型直接返回
    else:
        return data

# 使用示例
if __name__ == "__main__":
    # 读取原始JSON(实际场景可替换为文件读取:with open('data.json') as f: data = json.load(f))
    raw_json = """
    {
      "children": [
        {
          "name": "FirstLayer 1",
          "type": "Folder",
          "children": [
            {
              "name": "ID12345",
              "type": "Folder",
              "children": [
                {
                  "key1": "abc",
                  "key3": "Float8"
                },
                {
                  "key2": "abc",
                  "key4": "Float8"
                }
              ]
            }
          ]
        },
        {
          "name": "FirstLayer",
          "type": "Folder",
          "children": [
            {
              "name": "ID98765",
              "type": "Folder",
              "children": [
                {
                  "key1": "abc",
                  "key3": "Float8"
                },
                {
                  "key2": "abc",
                  "key4": "Float8"
                }
              ]
            }
          ]
        }
      ]
    }
    """
    data = json.loads(raw_json)
    target_ids = {"ID12345", "ID98765"}
    result = remove_id_layers(data, target_ids)
    # 输出格式化结果
    print(json.dumps(result, indent=2))

代码说明

  • 递归遍历所有节点,区分列表/字典类型分别处理,适配任意深度的嵌套结构。
  • 遇到children字段时自动递归处理其子节点,确保不会遗漏深层内容。
  • 匹配到目标ID节点时,直接提取该节点的子内容替代原节点,实现层级移除。
  • 无额外依赖,适合处理大型JSON文件。

可选替代方案

如果不想写递归,可以使用jsonpath-ng库通过路径匹配定位并替换节点,但需要先安装依赖:

pip install jsonpath-ng

不过递归方法无需额外依赖,更适合轻量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:03:31