我过去曾经使用过这种策略,并且对此感到非常满意:
dict使用以下结构将自定义对象编码为JSON对象文字(例如Python ):
{ '__ClassName__': { ... } }从本质上讲,这是一个项目,
dict其单键是一个特殊字符串,用于指定要编码的对象类型,并且其值是
dict实例属性的。如果这样的话。
编码器和解码器的一个非常简单的实现(从我实际使用的代码简化)如下:
TYPES = { 'ParentClass': ParentClass, 'ChildClass': ChildClass }class CustomTypeEnprer(json.JSONEnprer): """A custom JSonEnprer class that knows how to enpre core custom objects. Custom objects are enpred as JSON object literals (ie, dicts) with one key, '__TypeName__' where 'TypeName' is the actual name of the type to which the object belongs. That single key maps to another object literal which is just the __dict__ of the object enpred.""" def default(self, obj): if isinstance(obj, TYPES.values()): key = '__%s__' % obj.__class__.__name__ return { key: obj.__dict__ } return json.JSONEnprer.default(self, obj)def CustomTypeDeprer(dct): if len(dct) == 1: type_name, value = dct.items()[0] type_name = type_name.strip('_') if type_name in TYPES: return TYPES[type_name].from_dict(value) return dct在此实现中,假设您要编码的对象将具有一个
from_dict()类方法,该方法知道如何
dict从JSON解码后的实例中重新创建实例。
扩展编码器和解码器以支持自定义类型(例如
datetime对象)很容易。
EDIT
,以回答您的编辑:像这样的实现的好处是它将自动对
TYPES映射中找到的任何对象的实例进行编码和解码。这意味着它将自动处理ChildClass,如下所示:
class ChildClass(object): def __init__(self): self.foo = 'foo' self.bar = 1.1 self.parent = ParentClass(1)
这应该导致JSON如下所示:
{ '__ChildClass__': { 'bar': 1.1, 'foo': 'foo', 'parent': { '__ParentClass__': { 'foo': 1} } }}


