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

如何移除任意深度嵌套JSON中的指定空元素?

解决嵌套JSON中移除指定空值元素的问题

你的这个需求很常见——清理嵌套JSON里的各种空值和空容器。先说说你之前想的字符串替换思路:这种方法确实容易出问题,比如空对象{}在JSON字符串里可能和其他结构的子串混淆,而且嵌套层级深的时候,很难精准定位要替换的内容,完全不如直接递归遍历JSON结构来得可靠。

下面给你一个实用的解决方案,核心是用递归遍历每个元素,判断是否需要保留:

实现思路

因为JSON结构是嵌套的,递归是最自然的处理方式:

  • 对字典:遍历所有键值对,先递归清理值的内部结构,再判断清理后的值是否需要保留,只保留符合要求的键值对
  • 对列表:遍历每个元素,同样先递归清理,再过滤掉需要删除的元素
  • 对基础类型(字符串、数字等):直接判断是否属于要删除的集合

这里要注意一个坑:像{}, []这种空容器是可变对象,直接用in判断是否在values_to_drop里会不准确(因为不同实例的空容器是不同的对象),所以需要额外判断容器是否为空。

完整代码实现

def should_drop(value, values_to_drop):
    # 先检查基础值是否匹配(比如空字符串、空格)
    if value in values_to_drop:
        return True
    # 再检查可变容器是否为空(解决不同实例无法用in匹配的问题)
    if isinstance(value, (dict, list, tuple)) and len(value) == 0:
        return True
    return False

def clean_json(data, values_to_drop):
    # 处理字典类型
    if isinstance(data, dict):
        cleaned_dict = {}
        for key, value in data.items():
            # 先递归清理子结构
            cleaned_value = clean_json(value, values_to_drop)
            # 只有不需要删除的内容才保留
            if not should_drop(cleaned_value, values_to_drop):
                cleaned_dict[key] = cleaned_value
        return cleaned_dict
    # 处理列表类型
    elif isinstance(data, list):
        cleaned_list = []
        for item in data:
            cleaned_item = clean_json(item, values_to_drop)
            if not should_drop(cleaned_item, values_to_drop):
                cleaned_list.append(cleaned_item)
        return cleaned_list
    # 基础类型直接返回,后续由should_drop判断是否保留
    else:
        return data

# 测试你的示例数据
json_list = [
    {
        'class': 'Year 1',
        'room': 'Yellow',
        'students': [
            {'name': 'James', 'sex': 'M', 'grades': {}},
        ]
    },
    {
        'class': 'Year 2',
        'info': {
            'teachers': {
                'math': 'Alan Turing',
                'physics': []
            }
        },
        'students': [
            { 'name': 'Tony', 'sex': 'M', 'age': ''},
            { 'name': 'Jacqueline', 'sex': 'F' },
        ],
        'other': []
    }
]

values_to_drop = ({}, (), [], '', ' ')
cleaned_result = clean_json(json_list, values_to_drop)

# 格式化打印结果
import json
print(json.dumps(cleaned_result, indent=4))

代码运行结果

运行后会输出你期望的过滤后的JSON:

[
    {
        "class": "Year 1",
        "room": "Yellow",
        "students": [
            {
                "name": "James",
                "sex": "M"
            }
        ]
    },
    {
        "class": "Year 2",
        "info": {
            "teachers": {
                "math": "Alan Turing"
            }
        },
        "students": [
            {
                "name": "Tony",
                "sex": "M"
            },
            {
                "name": "Jacqueline",
                "sex": "F"
            }
        ]
    }
]

这个方案的优势是:

  • 支持任意深度的嵌套结构,不管你的JSON有多复杂都能处理
  • 逻辑清晰,每一步都明确处理不同类型的元素
  • 避免了字符串替换带来的各种边缘案例问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:07:40