❝本文示例代码及文件在
❞Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好,我是菜鸟哥。
我们在日常使用Python
的过程中,经常会使用json
格式存储一些数据,尤其是在web
开发中。而Python
原生的json
库性能差、功能少,只能堪堪应对简单轻量的json
数据存储转换需求。
![4ee2b3d523a2a57c6a8709772f8c1103.jpeg](https://i-blog.csdnimg.cn/blog_migrate/f6ec6227096e2cd7d50b722a7906a163.jpeg)
而本文我要给大家介绍的第三方json
库orjson
,在公开的各项基准性能测试中,以数倍至数十倍的性能优势碾压json
、ujson
、rapidjson
、simplejson
等其他Python
库,且具有诸多额外功能,下面我们就来领略其常用方法吧~
2 orjson常用方法
orjson
支持3.7
到3.10
所有版本64位的Python
,本文演示对应的orjson
的版本为3.7.0
,直接使用pip install -U orjson
即可完成安装。下面我们来对orjson
中的常用方法进行演示:
2.1 序列化
与原生json
库类似,我们可以使用orjson.dumps()
将Python
对象序列化为JSON
数据,注意,略有不同的是,orjson
序列化的结果并不是str
型而是bytes
型,在下面的例子中,我们对包含一千万个简单字典元素的列表进行序列化,orjson
与json
库的耗时比较如下:
![66ef44eb5a8a4289f4facdb74cbc038e.png](https://i-blog.csdnimg.cn/blog_migrate/5bc7d8faef95893e8be1c8a8af088ae8.png)
2.2 反序列化
将JSON
数据转换为Python
对象的过程我们称之为反序列化,使用orjson.loads()
进行操作,可接受bytes
、str
型等常见类型,在前面例子的基础上我们添加反序列化的例子:
![01a33fd26f6bc59f665ddd3d0d409382.png](https://i-blog.csdnimg.cn/blog_migrate/a13c29c2c339eaf8cf0f8bcba5c1efb8.png)
2.3 丰富的option选项
在orjson
的序列化操作中,可以通过参数option
来配置诸多额外功能,常用的有:
OPT_INDENT_2
通过配置option=orjson.OPT_INDENT_2
,我们可以为序列化后的JSON
结果添加2个空格的缩进美化效果,从而弥补其没有参数indent
的不足:
![8be8ac904392a8b30a6aa0fd28103805.png](https://i-blog.csdnimg.cn/blog_migrate/9877945b8ea9088f44163516ade0a18f.png)
OPT_OMIT_MICROSECONDS
orjson.dumps()
可以直接将Python
中datetime
、time
等标准库中的日期时间对象转换成相应的字符串,这是原生json
库做不到的,而通过配置option=orjson.OPT_OMIT_MICROSECONDS
,可以将转换结果后缀的毫秒部分省略掉:
![5cf94f33174659dbc39e729bdcf7f07a.png](https://i-blog.csdnimg.cn/blog_migrate/56acebb74761c3cb540d41de6b89c26d.png)
OPT_NON_STR_KEYS
当需要序列化的对象存在非数值型键时,orjson
默认会抛出TypeError
错误,这时需要配置option=orjson.OPT_NON_STR_KEYS
来强制将这些键转换为字符型:
![73121a3e5be6ede204bce27af11da250.png](https://i-blog.csdnimg.cn/blog_migrate/42f9503c0a16d48f3512c958cb0209db.png)
OPT_SERIALIZE_NUMPY
orjson
的一大重要特性是其可以将包含numpy
中数据结构对象的复杂对象,兼容性地转换为JSON
中的数组,配合option=orjson.OPT_SERIALIZE_NUMPY
即可:
![621fba2ed0a6b63800ea0584261d8427.png](https://i-blog.csdnimg.cn/blog_migrate/288beeb05e588fd7534747603bf3282a.png)
OPT_SERIALIZE_UUID
除了可以自动序列化numpy
对象外,orjson
还支持对UUID
对象进行转换,在orjson 3.0
之前的版本中,需要配合option=orjson.OPT_SERIALIZE_UUID
,而本文演示的3.X
版本则无需额外配置参数:
![6fde5f1a276ff64a2a3380c947089d3a.png](https://i-blog.csdnimg.cn/blog_migrate/0c969b956d96a50be90795355f4c8214.png)
OPT_SORT_KEYS
通过配合参数option=orjson.OPT_SORT_KEYS
,可以对序列化后的结果自动按照键进行排序:
![665979d3dccbf4c2b1b9fb1b017dec6a.png](https://i-blog.csdnimg.cn/blog_migrate/328ef52ec0ce120244b54ad5df4105dc.png)
组合多种option
当你的序列化操作需要涉及多种option
功能时,则可以使用|
运算符来组合多个option
参数即可:
![3b0c69f9d492c2eb0886a61e68325d13.png](https://i-blog.csdnimg.cn/blog_migrate/f8aac38a567cbc9f86a2dc64c3d1ff23.png)
2.4 针对dataclass、datetime添加自定义处理策略
当你需要序列化的对象中涉及到dataclass
自定义数据结构时,可以配合orjson.OPT_PASSTHROUGH_DATACLASS
,再通过对default
参数传入自定义处理函数,来实现更为自由的数据转换逻辑,譬如下面简单的例子中,我们可以利用此特性进行原始数据的脱敏操作:
![7aad0e77301768f090818e320733dda1.png](https://i-blog.csdnimg.cn/blog_migrate/ea7d06e5b5a4b78ba9ead6e5b7d43ebd.png)
类似的,针对datetime
类型数据,我们同样可以配合OPT_PASSTHROUGH_DATETIME
和自定义default
函数实现日期自定义格式化转换:
![0a9e946b6eea30d9584164fc1472564c.png](https://i-blog.csdnimg.cn/blog_migrate/8c2085e03a4c974474ff819db695f51d.png)
orjson
更多特性可前往官方仓库https://github.com/ijl/orjson
了解更多~
推荐阅读:
入门: 最全的零基础学Python的问题 | 零基础学了8个月的Python | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 | 从万众期待到口碑扑街!唐探3令人失望 | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏 | 九宫格 | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!| 再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|