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

