用simplejson序列化简单类对象的最简单方法?

我正在尝试使用JSON(使用simplejson)序列化python对象列表,并收到以下错误:对象“不可JSON序列化”。

该类是一个简单的类,其字段只有整数,字符串和浮点数,并且从一个父超类继承相似的字段,例如:

class ParentClass:

def __init__(self, foo):

self.foo = foo

class ChildClass(ParentClass):

def __init__(self, foo, bar):

ParentClass.__init__(self, foo)

self.bar = bar

bar1 = ChildClass(my_foo, my_bar)

bar2 = ChildClass(my_foo, my_bar)

my_list_of_objects = [bar1, bar2]

simplejson.dump(my_list_of_objects, my_filename)

foo,bar是我上面提到的简单类型。唯一棘手的事情是,ChildClass有时具有一个字段,该字段引用另一个对象(类型不是ParentClass或ChildClass)。

用simplejson将其序列化为json对象的最简单方法是什么?使它可序列化为字典是否足够?为ChildClass 简单地编写

方法的最佳方法是吗?最后,拥有引用另一个对象的字段会使事情变得复杂吗?如果是这样,我可以将代码重写为仅在类中具有简单字段(例如字符串/浮点等)。

谢谢。

回答:

我过去曾经使用过这种策略,并且对此感到非常满意:dict使用以下结构将自定义对象编码为JSON对象文字(例如Python ):

{ '__ClassName__': { ... } }

从本质上讲,这是一个项目,dict其单键是一个特殊字符串,用于指定要编码的对象类型,并且其值是dict实例属性的。如果这样的话。

编码器和解码器的一个非常简单的实现(从我实际使用的代码简化)如下:

TYPES = { 'ParentClass': ParentClass,

'ChildClass': ChildClass }

class CustomTypeEncoder(json.JSONEncoder):

"""A custom JSONEncoder class that knows how to encode core custom

objects.

Custom objects are encoded 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 encoded."""

def default(self, obj):

if isinstance(obj, TYPES.values()):

key = '__%s__' % obj.__class__.__name__

return { key: obj.__dict__ }

return json.JSONEncoder.default(self, obj)

def CustomTypeDecoder(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对象)很容易。

,以回答您的编辑:像这样的实现的好处是它将自动对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}

}

}

}

以上是 用simplejson序列化简单类对象的最简单方法? 的全部内容, 来源链接: utcz.com/qa/402772.html

回到顶部