辞書からサブクラス化して、それらのように動作する独自のクラスをいくつか設定しました。それでも、(Python を使用して) JSON にエンコードする場合は、辞書ではなく元のオブジェクトにデコードできるようにシリアル化する必要があります。
したがって、自分のクラスのネストされたオブジェクト (dict から継承されたもの) をサポートしたいと考えています。
私は次のようなものを試しました:
class ShadingInfoEncoder(json.JSONEncoder):
def encode(self, o):
if type(o).__name__ == "NodeInfo":
return '{"_NodeInfo": ' + super(ShadingInfoEncoder, self).encode(o) + '}'
elif type(o).__name__ == "ShapeInfo":
return '{"_ShapeInfo": ' + super(ShadingInfoEncoder, self).encode(o) + '}'
elif type(o).__name__ == "ShaderInfo":
return '{"_ShaderInfo": ' + super(ShadingInfoEncoder, self).encode(o) + '}'
return super(ShadingInfoEncoder, self).encode(o)
と:
class ShadingInfoEncoder(json.JSONEncoder):
def encode(self, o):
if isinstance(o, NodeInfo):
return '{"_NodeInfo": ' + super(ShadingInfoEncoder, self).encode(o) + '}'
elif isinstance(o, ShapeInfo):
return '{"_ShapeInfo": ' + super(ShadingInfoEncoder, self).encode(o) + '}'
elif isinstance(o, ShaderInfo):
return '{"_ShaderInfo": ' + super(ShadingInfoEncoder, self).encode(o) + '}'
return super(ShadingInfoEncoder, self).encode(o)
一般的には機能しますが、ネストされている場合、またはダンプされる最初のオブジェクトがそれらのタイプではない場合は機能しません。したがって、これは入力オブジェクトがそのタイプの場合にのみ機能します。ただし、ネストされている場合はそうではありません。
この JSON を再帰的にエンコードする方法がわからないため、ネストされた/含まれるすべてのインスタンスが同じルールに従ってエンコードされます。
JSONEncoder のデフォルト メソッドを使用する方が簡単だと思いました (オブジェクトがサポートされていないタイプの場合は常に呼び出されます)。しかし、私のオブジェクトは dict から継承されているため、「デフォルト」で処理されるのではなく、辞書に解析されます。方法。