dataclass_json中datetime字段为None时能否跳过编码解码?
条件编码规则实现方案
核心实现逻辑是自定义封装带空值判断的编解码函数,替换原有直接传入的datetime原生方法即可满足需求:当approver_time为None时直接返回空值,仅非空时执行编解码操作。
修改后的完整代码如下:
import datetime import dataclasses from dataclasses import field from dataclasses_json import dataclass_json, LetterCase, config from marshmallow import fields # 自定义带空值判断的时间编码器 def datetime_encoder(dt: datetime.datetime | None): if dt is None: return None return dt.isoformat() # 自定义带空值判断的时间解码器 def datetime_decoder(dt_str: str | None): if dt_str is None: return None return datetime.datetime.fromisoformat(dt_str) @dataclass_json(letter_case=LetterCase.CAMEL) @dataclasses.dataclass class A: approver_time: datetime.datetime = field(default=None, metadata=config( encoder=datetime_encoder, decoder=datetime_decoder, mm_field=fields.DateTime(format='iso', allow_none=True) ))
关键修改说明
- 自定义编解码函数优先判断入参是否为None,匹配到空值直接返回,不会调用后续的datetime方法,避免触发属性调用报错
- 给
mm_field的DateTime字段补充allow_none=True参数,适配marshmallow的空值校验规则,避免序列化/反序列化时抛出空值不合法的异常 - 修正了原有编解码调用的类:原有代码使用
datetime.date的方法,和字段声明的datetime.datetime类型不匹配,调整后不会丢失时分秒信息
效果验证
你可以通过以下代码测试功能是否符合预期:
# 空值序列化测试 a1 = A() print(a1.to_json()) # 输出包含"approverTime": null,无报错 # 非空值序列化测试 a2 = A(approver_time=datetime.datetime(2024, 5, 20, 14, 30, 0)) print(a2.to_json()) # 输出approverTime为"2024-05-20T14:30:00" # 空值反序列化测试 json_str1 = '{"approverTime": null}' a3 = A.from_json(json_str1) print(a3.approver_time) # 输出None # 非空值反序列化测试 json_str2 = '{"approverTime": "2024-05-20T14:30:00"}' a4 = A.from_json(json_str2) print(a4.approver_time) # 输出对应datetime对象:2024-05-20 14:30:00
内容的提问来源于stack exchange,提问作者kev0h1
相关产品推荐
相关产品推荐

