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


Posted in Python onApril 06, 2022

1. 引言

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

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}

4. 总结

本文重点介绍了在Python中,如何来将自定义对象序列化为JSON以JOSN格式进行输出,由浅入深给出了不同的解决方案,并给出了相应的源代码。

到此这篇关于在Python 中将类对象序列化为JSON的文章就介绍到这了,更多相关Python 将类对象序列化JSON内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中除法使用的注意事项
Aug 21 Python
python获取android设备的GPS信息脚本分享
Mar 06 Python
深入解析Python中的集合类型操作符
Aug 19 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
Python实现某论坛自动签到功能
Aug 20 Python
利用python生成照片墙的示例代码
Apr 09 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
python unittest单元测试的步骤分析
Aug 02 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
相对路径转化成绝对路径
2007/04/10 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
Python3实现生成随机密码的方法
2014/08/23 Python
python中正则表达式的使用详解
2014/10/17 Python
使用python开发vim插件及心得分享
2014/11/04 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
Python上下文管理器全实例详解
2019/11/12 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
numba提升python运行速度的实例方法
2021/01/25 Python
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
库房管理员岗位职责
2014/03/09 职场文书
软件项目实施计划书
2014/05/02 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
2015学校年度工作总结
2015/05/11 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
Python可视化学习之seaborn调色盘
2022/02/24 Python
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL