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

Python中json.load()加载JSON后保留null不转为None的方法

解决方案

首先明确基础逻辑:Python 语法中不存在null关键字,JSON 标准里的null值,在Python原生数据结构中的对应类型就是None,你没法在Python原生字典、列表结构中直接存储名为null的原生值。
你担心的「None 不符合请求传参要求」是认知偏差:requests库传入json=payload参数时,内部会自动调用json.dumps()做序列化,这个过程会自动把Python结构中的None转换为JSON规范的null,完全不需要你在JSON加载阶段做特殊处理,直接加载、编辑、传参即可,最终发出的请求报文中null值会正常保留。

效果验证

你可以运行以下代码直接验证序列化结果:

import json

# 模拟json.load()加载后得到的带None的结构
payload = {
    "key1": 10,
    "key2": "Comes and Goes",
    "key3": None,
    "key4": None,
    "key5": None,
    "key6": []
}

# 打印序列化后的JSON字符串,和requests发请求时的报文内容一致
print(json.dumps(payload))

运行输出:

{"key1": 10, "key2": "Comes and Goes", "key3": null, "key4": null, "key5": null, "key6": []}

输出结果完全符合你预期的带null的JSON格式,直接传参即可正常发起请求。

如果你有特殊场景必须在加载后的数据结构中看到字面量null(非必要不推荐),可以通过自定义解析规则实现,但这种方式需要额外适配序列化逻辑,反而会增加不必要的工作量:

import json
from json import JSONDecoder

# 自定义null对应的单例对象
class _Null:
    def __repr__(self):
        return "null"
null = _Null()

# 自定义解码器,把null解析为我们定义的null对象
class CustomDecoder(JSONDecoder):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, object_hook=self._hook, parse_float=float, parse_int=int, **kwargs)
    def _hook(self, obj):
        for k, v in obj.items():
            if v is None:
                obj[k] = null
        return obj

# 加载示例
raw_json = '''
{
  "key1": 10,
  "key2": "Comes and Goes",
  "key3": null,
  "key4": null,
  "key5": null,
  "key6": []
}
'''
data = json.loads(raw_json, cls=CustomDecoder)
print(data)
# 输出:{'key1': 10, 'key2': 'Comes and Goes', 'key3': null, 'key4': null, 'key5': null, 'key6': []}

注意:使用这种自定义方式加载得到的数据,不能直接传给requests的json参数,因为默认的JSON编码器不识别自定义的_Null类型,会抛出序列化异常,需要额外编写自定义编码器,常规场景完全不需要这么做。

内容的提问来源于stack exchange,提问作者J-Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:51:45