在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自动12306抢票软件实现代码
Feb 24 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
python实现linux下抓包并存库功能
Jul 18 Python
利用python将图片版PDF转文字版PDF
May 03 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
python sorted方法和列表使用解析
Nov 18 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
pandas中ix的使用详细讲解
Mar 09 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
Django视图、传参和forms验证操作
Jul 15 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
python中pow函数用法及功能说明
Dec 04 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
PHP自动更新新闻DIY
2006/10/09 PHP
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
js实现文字滚动效果
2016/03/03 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
幼儿园门卫岗位职责
2014/02/14 职场文书
道路施工安全责任书
2014/07/24 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
vue 给数组添加新对象并赋值
2022/04/20 Vue.js
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB