01引言
序列化是将对象转换为可以在以后保存和检索介质中的过程,比如将对象的当前状态保存到文件中。对于复杂的项目,序列化是所有开发人员迟早要做的事情之一。Python 语言以其易用性而闻名,许多常见的编程任务可以用几行代码就能完成,包括文件 I/O 和绘图等功能。在 Python 中实现序列化也非常简单。
在本文中,我将向您介绍如何将类对象序列化为 JSON 对象的一些技巧。
02举个例子
为了演示序列化的技巧,我们首先定义一个示例类:
<code>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</code>
如果我们尝试直接打印类的对象,将会得到错误信息:
<code>label = LabelSimple("person", 10, 10, 4, 10) print(label)</code>
Python 的 JSON 库提供了一个方便的方法 json.dumps()
,可以将任何 Python 对象转换为 JSON。我们尝试调用这个方法:
<code>import json print(json.dumps(label))</code>
03简单方案
为了能够序列化类对象,最简单的方法是使用内置的 __dict__
方法显示对象的内容:
<code>label = LabelSimple("person", 10, 10, 4, 10) print(label.__dict__) print(json.dumps(label.__dict__))</code>
输出如下:
<code>{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10} {"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}</code>
使用这种方法,print()
和 json.dumps()
函数都可以将类对象的内容以 JSON 格式输出。
04进阶方案
尽管上述方法可以实现序列化的目的,但是每次都需要调用 __dict__
方法有些繁琐。我们可以通过实现类的内置函数 __str__
和 __repr__
来简化这个过程:
<code>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)</code>
05实现 JSON encoder
为了支持 json.dumps
用例,常用的方法是通过继承 JSONEncoder
来实现自定义编码器类。在这个例子中,我们希望对象是 JSON 字典格式,因此我们只需返回字典:
<code>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))</code>
06总结
本文介绍了如何在 Python 中将自定义对象序列化为 JSON,并以 JSON 格式输出。我们从简单到进阶提供了不同的解决方案,并给出了相应的源代码。
暂无评论内容