我已经阅读了一些解决类似内容的问题,但想问一下这个问题。
我有两个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类?
谢谢!
答案 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
进行编码可能现在可以正常工作,但如果您的课程发展,这实际上不是将来的证据。