使用嵌套自定义类型的python(内置)json de / serilazation

时间:2013-11-26 12:20:10

标签: python json python-2.7 serialization

我对python2(2.7)中的json模块没有多少经验。现在我遇到了一个问题:如何将自定义对象序列化为json,然后将其反序列化。

我将此对象层次结构作为示例:

class Company(object):
    def __init__(self, company_id):
        self.company_id = company_id
        self.name = ''
        # other 10 attributes with simple type
        ...
        self.departments = [] #list of Dept objects

class Dept(object):
    def __init__(self, dept_id):
        self.dept_id = dept_id
        self.name = ''
        # other 10 attributes with simple type
        ...
        self.persons = [] #list of Person objs


class Person(object):
    def __init__(self, per_id):
        self.per_id = per_id
        self.name = ''
        # other 10 attributes with simple type
        ...
        self.skills = [] #list of Skill objs

class Skill(object):
    def __init__(self, skill_id):
        self.skill_id = skill_id
        self.name = ''
        # other 10 attributes with simple type
        ...
        self.foos = [] #list of Foo objs

class Foo(object):
    .....

现在说我从Company获得了一个对象,其中填充了嵌套对象的所有属性和列表。我想将对象保存到json文件中。然后将其加载回来,以便加载那些嵌套对象(departments, persons, skills)。

我读过pydoc,知道json de / encoding是基于dict的。我现在可以用这个进行序列化:

    json.dump(company_obj, jsonfile, default = lambda o: o.__dict__, sort_keys=True, indent=4)

但很难在以后将其恢复到Company

我认为这个问题很常见。我在这里搜索了SO和谷歌,没有找到有用的信息。

在这种情况下,执行json序列化和反序列化的正确方法是什么。

1 个答案:

答案 0 :(得分:0)

您需要的是自定义编码器和解码器。这些记录在此处:http://docs.python.org/2/library/json.html#encoders-and-decoders

一种有效的解决方案是在编码时将限定类名添加到dict中,并在解码时使用它来创建正确类的实例。