Python中类对象序列化为JSON的方法

图片[1]-Python中类对象序列化为JSON的方法-山海云端论坛

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 格式输出。我们从简单到进阶提供了不同的解决方案,并给出了相应的源代码。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容