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
相关产品推荐
相关产品推荐

