温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在Python中怎么将类对象序列化为JSON

发布时间:2022-04-06 13:40:08 来源:亿速云 阅读:197 作者:iii 栏目:开发技术

本文小编为大家详细介绍“在Python中怎么将类对象序列化为JSON”,内容详细,步骤清晰,细节处理妥当,希望这篇“在Python中怎么将类对象序列化为JSON”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    1. 引言

    序列化是将对象转换为可以在以后保存和检索介质中的过程。比如,将对象的当前状态保存到文件中。对于一些复杂的项目,序列化是所有开发人员迟早要做的事情。
    Python 语言的优点之一是它在许多常见的编程任务中易于使用,往往只需几行代码,就可以实现读取文件 IO、绘制图表等功能,序列化在 Python 中实现起来也非常容易。

    2. 举个栗子

    为了讲述序列化的技巧,我们首先来定义一个类作为示例,

    代码如下:

    class LabelSimple:
    def __init__(self, label, x, y, width, height):
    self.label = label
    self.x = x
    self.y = y
    self.width = width
    self.height = height

    如果我们想要将其序列化(比如直接打印类的对象),我们将会得到如下错误信息:

    label = LabelSimple("person", 10, 10, 4, 10)
    print(label)
    >> __main__.LabelSimple object at 0x000002C3913EB2E0>

    Python中的JSON 库提供了一个方便的方法,称为 json.dumps() 。它可以将任何 Python 对象转换为 JSON。这听起来很简单,我们不妨来直接调用试试看。

    import json
    
    print(json.dumps(label))
    >>...
    /usr/lib/python3.7/json/encoder.py in default(self, o)
    177
    178 """
    --> 179 raise TypeError(f'Object of type {o.__class__.__name__} '
    180 f'is not JSON serializable')
    181
    
    TypeError: Object of type LabelSimple is not JSON serializable

    json.dumps() 为我们自定义对象调用相应的编码器,并且由于我们没有实现编码器而引发类对象错误。

    3. 解决方案

    3.1 使用 json.dumps() 和 __dict__

    为了将上述类对象可以直接序列化后输出,我们能想到的最简单的方式就是使用内置的 __dict__ 方法来显示对象的内容.

    代码如下:

    label = Label("person", 10, 10, 4, 10)
    print(label.__dict__)
    print(json.dumps(label.__dict__))

    输出如下:

    {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
    {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}

    可以看出使用上述方法后, print() 函数和 json.dumps() 函数可以将类对象内容以JSON格式进行输出。

    3.2 实现 __str__ 和 __repr__

    上述实现虽然可以实现序列化的目的,但是我们每次都需要调用 __dict__方法,多少有点麻烦。我们还可以有更简单的方法,那就是实现类的内置函数__str__repr__

    代码如下:

    class Label:
    def __init__(self, label, x, y, width, height):
    self.label = label
    self.x = x
    self.y = y
    self.width = width
    self.height = height
    
    def __iter__(self):
    yield from {
    "label": self.label,
    "x": self.x,
    "y": self.y,
    "width": self.width,
    "height": self.height
    }.items()
    
    def __str__(self):
    return json.dumps(dict(self), ensure_ascii=False)
    
    def __repr__(self):
    return self.__str__()

    调用代码如下:

    label = Label("person", 10, 10, 4, 10)
    print(label)
    # print(json.dumps(label))

    上述代码,print可以输出序列化后的JSON内容,但是json.dumps依旧不能正常工作,这是因为我们并没有实现encoder。

    3.3 实现 JSON encoder

    为了支持 json.dumps 用例,常用的方法是通过继承 JSONEncoder 来实现自定义编码器类。在上述例子中,由于我们希望对象是 JSON 字典格式,所以我们只是返回字典。

    代码如下:

    from json import JSONEncoder
    
    class MyEncoder(JSONEncoder):
    def default(self, obj):
    return obj.__dict__
    
    label = Label("person", 10, 10, 4, 10)
    print(MyEncoder().encode(label))
    print(json.dumps(label, cls=MyEncoder))
    print(label)

    输出如下:

    # outputs of a Label class object
    {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
    {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
    {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}

    读到这里,这篇“在Python中怎么将类对象序列化为JSON”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI