在Python中将自定义对象序列化为JSON的方法

5 投票
2 回答
7369 浏览
提问于 2025-04-18 08:31

一般来说,我们可以定义一个叫做 __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 个回答

7

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能会在使用某个特定的功能时,发现它没有按照预期工作。这种情况可能会让人感到困惑,不知道该如何解决。

通常,解决这类问题的第一步是检查你的代码,看看有没有拼写错误或者逻辑上的问题。很多时候,问题可能就出在这些小细节上。

如果你确认代码没有问题,接下来可以查阅相关的文档或者社区论坛,看看其他人是否遇到过类似的问题。很多时候,别人已经分享了解决方案,这样你就可以少走弯路。

另外,调试也是一个很重要的步骤。你可以通过打印一些变量的值,来了解程序在运行时的状态,这样有助于找到问题的根源。

总之,遇到问题时,不要慌张,仔细检查代码,利用好文档和社区资源,逐步排查,通常都能找到解决办法。

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"}
9

如果你只需要把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 会引发名字混淆,这可能不是你想要的效果。)

撰写回答