在Python中将自定义对象序列化为JSON的方法
一般来说,我们可以定义一个叫做 __str__
的方法,这样当我们用 str(obj)
时,就能返回我们想要的内容。
但是现在我想让我的模型对象在使用 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__)
2 个回答
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能会在使用某个特定的功能时,发现它没有按照预期工作。这种情况可能会让人感到困惑,不知道该如何解决。
通常,解决这类问题的第一步是检查你的代码,看看有没有拼写错误或者逻辑上的问题。很多时候,问题可能就出在这些小细节上。
如果你确认代码没有问题,接下来可以查阅相关的文档或者社区论坛,看看其他人是否遇到过类似的问题。很多时候,别人已经分享了解决方案,这样你就可以少走弯路。
另外,调试也是一个很重要的步骤。你可以通过打印一些变量的值,来了解程序在运行时的状态,这样有助于找到问题的根源。
总之,遇到问题时,不要慌张,仔细检查代码,利用好文档和社区资源,逐步排查,通常都能找到解决办法。
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"}
如果你只需要把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)
。
如果你想要把JSON转换回Python对象,那就需要至少有一个类的列表,这些类里要有一个叫做 _fromjson
的方法。
(注意:以 __foo__
开头的名字是保留的,所以你不应该自己定义这些名字。 __bar
会引发名字混淆,这可能不是你想要的效果。)