JSON编码自定义类不调用overriden默认值

时间:2017-11-14 17:28:52

标签: json python-2.7

我有一个基于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很陌生,所以如果这是非常明显的事情,请道歉。

1 个答案:

答案 0 :(得分:0)

经过一些进一步的挖掘和追踪后,我想我找到了原因。部分问题我认为这是我自己对如何使用它的误解。

如果您希望使用自定义编码器,则在调用json.dumps时需要指定该编码器的类,否则dumps默认使用JSONEncoder的标准实现。

json.dumps(obj, cls=MyEncoder)

我的误解是,我的课程基于json.JSONEncoderdumps只会将实例识别为继承自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)

它识别我的类并处理它,或将编码传递给默认编码器。