2017-11-14 5 views
1

私はjson.JSONEncoderに基づいているクラス定義を持っています。その中でデフォルトのメソッドをオーバーライドしています。今では、そのクラスのインスタンスでjson.dumpsを呼び出すと、デフォルトのメソッドが呼び出されていませんか?私が見逃したことはありますか?JSONエンコードのカスタムクラスがオーバーライドのデフォルトを呼び出さない

私のコード例では、これは魔法のようにシリアル化されたオブジェクトを生成するとは思っていませんが、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

これ以上の掘削と追跡の後、私は原因を見つけたと思う。問題の一部私は、これがどのように使われることを意図しているのか私自身が誤解していると思う。

カスタムエンコーダを使用する場合は、を呼び出すときは、そのエンコーダのクラスを指定する必要があります。そうでない場合は、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) 

を使用シリアライズしたいとき。

関連する問題