在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中requests模块的使用方法
Apr 08 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
Oct 11 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 Python
Tensorflow的常用矩阵生成方式
Jan 04 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
python的Jenkins接口调用方式
May 12 Python
序列化Python对象的方法
Aug 01 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
解析PHP无限级分类方法及代码
2013/06/21 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
Symfony生成二维码的方法
2016/02/04 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
Web服务器框架 Tornado简介
2014/07/16 Python
Python实现随机选择元素功能
2017/09/14 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
详解django.contirb.auth-认证
2018/07/16 Python
python实现点对点聊天程序
2018/07/28 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
使用pip安装python库的多种方式
2019/07/31 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
教师节学生演讲稿
2014/09/03 职场文书
消防安全培训工作总结
2015/10/23 职场文书
python tkinter实现定时关机
2021/04/21 Python
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android