在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 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
详解Django中Request对象的相关用法
Jul 17 Python
python使用tkinter实现简单计算器
Jan 30 Python
解决Python2.7读写文件中的中文乱码问题
Apr 12 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
Python魔法方法功能与用法简介
Apr 04 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
在python中修改.properties文件的操作
Apr 08 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
You might like
smarty内置函数section的用法
2015/01/22 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
javascript模块化简单解析
2016/04/07 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
python的id()函数介绍
2013/02/10 Python
Python计算字符宽度的方法
2016/06/14 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
详解Python字典的操作
2019/03/04 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
在python中修改.properties文件的操作
2020/04/08 Python
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
金士达面试非笔试
2012/03/14 面试题
踏青活动策划方案
2014/08/19 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
python基础之类属性和实例属性
2021/10/24 Python
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL