通常,我们可以定义__str__
方法,使str(obj)
返回我们想要的内容。
但现在我想定义我的Model对象,以便在使用json.dumps(obj)
时返回默认的JSON字符串。
有没有什么好方法可以在类中声明一个方法来执行此操作?
class MyClass:
...
def __json__(self):
return {'name': self.name, 'age': self.age}
obj = MyClass()
json.dumps(obj) # returns the same as json.dumps(obj.__json__)
答案 0 :(得分:7)
如果你只需要Python - > JSON,编写一个为任何对象调用这种方法的JSONEncoder类很简单:
class AutoJSONEncoder(JSONEncoder):
def default(self, obj):
try:
return obj._json()
except AttributeError:
return JSONEncoder.default(self, obj)
然后,您可以直接使用该课程AutoJSONEncoder().encode(obj)
或dumps
界面json.dumps(obj, cls=AutoJSONEncoder)
。
反方向至少需要一个可以调用_fromjson
方法的类列表。
(注意:__foo__
名称是保留的,因此您不应为自己的目的定义它们。__bar
调用名称修改,这可能不是您想要的。)< / p>
答案 1 :(得分:6)
import json
class MyEncoder(json.JSONEncoder):
"""
JSONEncoder subclass that leverages an object's `__json__()` method,
if available, to obtain its default JSON representation.
"""
def default(self, obj):
if hasattr(obj, '__json__'):
return obj.__json__()
return json.JSONEncoder.default(self, obj)
class MyClass(object):
name = 'John'
age = 30
def __json__(self):
return {'name': self.name, 'age': self.age}
>>> json.dumps(MyClass(), cls=MyEncoder)
{"age": 30, "name": "John"}