1

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

我有两个 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 类?

谢谢!

4

2 回答 2

1

您需要提供一个函数来将您的自定义类编码defaultjson.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()方法,但上述方法更灵活。

于 2012-08-03T10:06:13.270 回答
1

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

__dict__您对类实例进行编码的尝试Provision现在可能有效,但如果您的类不断发展,这确实不是未来的证明。

于 2012-08-02T14:49:18.600 回答