在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 15 Python
使用python绘制二元函数图像的实例
Feb 12 Python
python django model联合主键的例子
Aug 06 Python
Python如何调用JS文件中的函数
Aug 16 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
Python 发送邮件方法总结
Aug 10 Python
Python中常用的os操作汇总
Nov 05 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python xlwt模块的使用解析
Apr 13 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
python运行脚本文件的三种方法实例
Jun 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中的错误处理和异常处理
2017/02/04 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
python 2.7.14安装图文教程
2018/04/08 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
python实现任意位置文件分割的实例
2018/12/14 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
施工班组长岗位职责
2014/01/05 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
伊索寓言教学反思
2014/05/01 职场文书
简爱电影观后感
2015/06/10 职场文书
谢师宴家长致辞
2015/07/27 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python