在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实现删除文件与目录的方法
Nov 10 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
Python中的元组介绍
Jan 28 Python
python如何制作缩略图
Apr 30 Python
我就是这样学习Python中的列表
Jun 02 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
再谈JavaScript线程
2015/07/10 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
Django 用户认证组件使用详解
2019/07/23 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
英文版区域经理求职信
2013/10/23 职场文书
专业销售业务员求职信
2013/11/18 职场文书
工作自我评价分享
2013/12/01 职场文书
网络研修随笔感言
2014/02/17 职场文书
党员公开承诺书范文
2014/03/25 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android