如何移除任意深度嵌套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
相关产品推荐
相关产品推荐

