JSON编码Python类列表

时间:2012-08-02 14:37:04

标签: python json class

我已经阅读了一些解决类似内容的问题,但想问一下这个问题。

我有两个Python类,在这里简化:

class Service:
    def __init__(self):
        self.ServiceName = None
        self.ServiceExpDate = None

class Provision:
    def __init__(self):
        self.ID = None
        self.Type = None
        self.Services = [] # a list of Service objects

当我转到JSON编码Provision类的实例时:

jsonProvision = json.dumps(provision.__dict__)

如果我没有任何服务,我会得到正确的输出,但如果它尝试序列化我得到的服务类:

TypeError: <common.Service instance at 0x123d7e8> is not JSON serializable

我是否需要编写一个JSON编码器来直接处理这个问题,还是有更好的方法来序列化Service类?

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要提供一个函数来将自定义类编码为default参数json.dumps()。类的示例代码:

import json

class JSONEncodable(object):
    def json(self):
        return vars(self)

class Service(JSONEncodable):
    def __init__(self):
        self.ServiceName = None
        self.ServiceExpDate = None

class Provision(JSONEncodable):
    def __init__(self):
        self.ID = None
        self.Type = None
        self.Services = [] # a list of Service objects

使用示例:

>>> from operator import methodcaller
>>> p = Provision()
>>> p.Services.append(Service())
>>> print json.dumps(p, default=methodcaller("json"))
{"Services": [{"ServiceName": null, "ServiceExpDate": null}], "Type": null, "ID": null}

您还可以使用default=attrgetter("__dict__")来避免在每个课程中使用json()方法,但上述方法更灵活。

答案 1 :(得分:0)

你应该编写一个负责你的类的编码器,这就是json模块的使用/扩展方式。

您尝试对__dict__类实例的Provision进行编码可能现在可以正常工作,但如果您的课程发展,这实际上不是将来的证据。