我有一个基于json.JSONEncoder的类定义,我在其中覆盖了默认方法。现在,当我在该类的实例上调用json.dumps时,默认方法没有被调用?有没有我错过的东西?
在我的示例代码中,我不希望这会神奇地生成序列化对象,但我希望print("here")
能够执行。
import json
class MyClass(json.JSONEncoder):
id = "myId"
data = "myData"
def default(self, o):
print("here")
print ("Create instance")
obj = MyClass()
print("Serialize")
print(json.dumps(obj))
print ("and done")
我对Python很陌生,所以如果这是非常明显的事情,请道歉。
答案 0 :(得分:0)
经过一些进一步的挖掘和追踪后,我想我找到了原因。部分问题我认为这是我自己对如何使用它的误解。
如果您希望使用自定义编码器,则在调用json.dumps
时需要指定该编码器的类,否则dumps
默认使用JSONEncoder
的标准实现。
json.dumps(obj, cls=MyEncoder)
我的误解是,我的课程基于json.JSONEncoder
,dumps
只会将实例识别为继承自JSONEncoder
并调用覆盖default
方法。但事实并非如此。
我现在已经在其自己的类中创建了逻辑来编码我自己的类/类型,当我调用json.dumps
时,我传入了该类名。
所以我现在有了
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, MyClass):
return {"id": obj.id, "data": obj.data}
return json.JSONEncoder.default(self, obj)
当我希望序列化时,我使用
json.dumps(object_to_serialize, cls=MyEncoder)
它识别我的类并处理它,或将编码传递给默认编码器。