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

如何为json.dumps的cls参数传入两个JSONEncoder类?

问题:同时序列化UUID和datetime类型到JSON

我想要将类实例序列化为JSON,但我的类包含UUID和datetime成员,因此遇到了如下TypeError:

TypeError: Object of type datetime is not JSON serializable

我通过为每种类型创建单独的类,分别解决了UUID和datetime的序列化问题:

import json
import datetime
import uuid

class DTEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return str(obj)
        return json.JSONEncoder.default(self, obj)

class UUIDEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, uuid.UUID):
            # if the obj is uuid, we simply return the value of uuid
            return obj.hex
        return json.JSONEncoder.default(self, obj)

我是这样单独使用这些类的:

convertedReadObject=json.dumps(ReadObject,cls=UUIDEncoder)

其中ReadObject包含UUID成员。但现在我需要同时处理两种类型,因此需要为cls参数传入这两个类,该如何实现?


解决方案

不需要给cls参数传入两个类,只需创建一个整合了两种类型判断的编码器即可,代码如下:

import json
import datetime
import uuid

class CombinedEncoder(json.JSONEncoder):
    def default(self, obj):
        # 处理datetime类型
        if isinstance(obj, datetime.datetime):
            return str(obj)
        # 处理UUID类型
        elif isinstance(obj, uuid.UUID):
            return obj.hex
        # 其他未匹配的类型交给父类默认处理逻辑
        return super().default(obj)

使用时直接指定这个整合后的编码器:

convertedReadObject = json.dumps(ReadObject, cls=CombinedEncoder)

可选方案:多重继承

如果你想复用之前写好的两个编码器,也可以通过多重继承实现:

class CombinedEncoder(DTEncoder, UUIDEncoder):
    pass

这种方式会按方法解析顺序(MRO)依次调用父类的default方法,先检查是否是datetime类型,再检查是否是UUID类型,同样能实现同时处理两种类型的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:01:39