在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程序运行效率的6个方法
Mar 31 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
Python实现批量下载图片的方法
Jul 08 Python
Python中的默认参数实例分析
Jan 29 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
pandas如何处理缺失值
Jul 31 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
Django继承自带user表并重写的例子
Nov 18 Python
python生成并处理uuid的实现方式
Mar 03 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
jQuery实现评论模块
2020/08/19 jQuery
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
Python读写Excel文件的实例
2013/11/01 Python
使用Python 统计高频字数的方法
2019/01/31 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
高三政治教学反思
2014/02/06 职场文书
四风问题查摆材料
2014/08/25 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
初中信息技术教学计划
2015/01/22 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android