在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 相关文章推荐
PyQt5每天必学之切换按钮
Aug 20 Python
django中模板的html自动转意方法
May 27 Python
python存储16bit和32bit图像的实例
Dec 05 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
python求平均数、方差、中位数的例子
Aug 22 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
python hmac模块验证客户端的合法性
Nov 07 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
关于Numpy之repeat、tile的用法总结
Jun 02 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
PHP之COOKIE支持详解
2010/09/20 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
Prototype框架详解
2015/11/25 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
Python绘制七段数码管实例代码
2017/12/20 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
Python中包的用法及安装
2020/02/11 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
配件采购员岗位职责
2013/12/03 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
毕业实习评语
2014/02/10 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
交通事故私了协议书
2014/04/16 职场文书
技术合作协议书范本
2014/04/18 职场文书
关于旅游的活动方案
2014/08/15 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
学习三严三实心得体会
2014/10/13 职场文书
关于感谢信的范文
2015/01/23 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
工厂无线对讲系统解决方案
2022/02/18 无线电