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

如何使用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)

小提示

  1. 判断是否为None时,推荐用value is not None而非value != None:is是判断对象身份,更严谨,不会被自定义的类方法干扰。
  2. 不要用list作为变量名,它是Python的内置类型,会覆盖内置函数引发潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:02:40