如何使用Python正确移除二维JSON中的空值(null)
如何用Python移除二维JSON列表中所有的null值?
首先来看你的场景和遇到的问题:
我有一个如下所示的二维JSON:
a = [ { "photo": None, .... "webUrl": None, "createdByUser": None, "lastModifiedByUser": None, "id": "154854566458484754...." }, { "photo": None, .... "webUrl": None, "createdByUser": None, "lastModifiedByUser": None, "id": "154854566458484000...." }, ]我已经掌握了一维JSON的处理方式,代码如下:
filtered_data = {} for key, value in data.items(): if value != None: filtered_data[key] = value但处理二维JSON时,我编写的代码出现了问题:
filtered_data = {} list = [] i = 0 length = len(data) for i in range(0, length): for key, value in data[i].items(): if value != None and key != '@odata.type': filtered_data[key] = value list.append(filtered_data) return list运行后得到的结果是多次重复的JSON最后一条数据,希望得到正确的解决方法。
问题原因分析
你的代码问题出在**filtered_data = {}定义在了循环外部**:每次遍历列表中的字典时,你都是在修改同一个字典对象,而list.append(filtered_data)添加的是这个字典的引用(不是新的字典副本)。最终列表里的所有元素其实都指向同一个字典,自然显示的都是最后一次循环修改后的结果。
正确解决方法
方法一:封装一维处理逻辑为函数(易读性高)
先把一维字典的过滤逻辑封装成独立函数,再遍历二维列表逐个处理,这样每次处理都会生成新的字典:
def filter_null_fields(dictionary): filtered_dict = {} for key, value in dictionary.items(): # 保留非None且不是@odata.type的键值对 if value is not None and key != '@odata.type': filtered_dict[key] = value return filtered_dict # 示例数据 original_data = [ {"photo": None, "webUrl": None, "createdByUser": None, "lastModifiedByUser": None, "id": "154854566458484754"}, {"photo": None, "webUrl": None, "createdByUser": None, "lastModifiedByUser": None, "id": "154854566458484000"}, ] # 处理二维列表 filtered_result = [filter_null_fields(item) for item in original_data] print(filtered_result)
方法二:用推导式简化代码(Python风格)
如果想更简洁,可以直接用字典推导式+列表推导式一步完成,效果和方法一完全一致:
original_data = [ {"photo": None, "webUrl": None, "createdByUser": None, "lastModifiedByUser": None, "id": "154854566458484754"}, {"photo": None, "webUrl": None, "createdByUser": None, "lastModifiedByUser": None, "id": "154854566458484000"}, ] filtered_result = [ {k: v for k, v in item.items() if v is not None and k != '@odata.type'} for item in original_data ] print(filtered_result)
小提示
- 判断是否为
None时,推荐用value is not None而非value != None:is是判断对象身份,更严谨,不会被自定义的类方法干扰。 - 不要用
list作为变量名,它是Python的内置类型,会覆盖内置函数引发潜在问题。
内容的提问来源于stack exchange,提问作者ChsharpNewbie
相关产品推荐
相关产品推荐

