在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中的列表生成式与生成器学习教程
Mar 13 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
python实现网页自动签到功能
Jan 21 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
python框架flask表单实现详解
Nov 04 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
NumPy统计函数的实现方法
Jan 21 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
python产生模拟数据faker库的使用详解
Nov 04 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
python里glob模块知识点总结
Jan 05 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
php中autoload的用法总结
2013/11/08 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
pycharm重命名文件的方法步骤
2019/07/29 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
家长学校实施方案
2014/03/15 职场文书
工作鉴定评语
2014/05/04 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
canvas实现贪食蛇的实践
2022/02/15 Javascript
什么是SOLID
2022/03/24 Javascript
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android