(数据科学学习手札137)orjson:Python中最好用的json库
本文示例代码及文件已上传至我的
Github仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,我们在日常使用Python的过程中,经常会使用json格式存储一些数据,尤其是在web开发中。而Python原生的json库性能差、功能少,只能堪堪应对简单轻量的json数据存储转换需求。

而本文我要给大家介绍的第三方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库的耗时比较如下:

2.2 反序列化
将JSON数据转换为Python对象的过程我们称之为反序列化,使用orjson.loads()进行操作,可接受bytes、str型等常见类型,在前面例子的基础上我们添加反序列化的例子:

2.3 丰富的option选项
在orjson的序列化操作中,可以通过参数option来配置诸多额外功能,常用的有:
- OPT_INDENT_2
通过配置option=orjson.OPT_INDENT_2,我们可以为序列化后的JSON结果添加2个空格的缩进美化效果,从而弥补其没有参数indent的不足:

- OPT_OMIT_MICROSECONDS
orjson.dumps()可以直接将Python中datetime、time等标准库中的日期时间对象转换成相应的字符串,这是原生json库做不到的,而通过配置option=orjson.OPT_OMIT_MICROSECONDS,可以将转换结果后缀的毫秒部分省略掉:

- OPT_NON_STR_KEYS
当需要序列化的对象存在非数值型键时,orjson默认会抛出TypeError错误,这时需要配置option=orjson.OPT_NON_STR_KEYS来强制将这些键转换为字符型:

- OPT_SERIALIZE_NUMPY
orjson的一大重要特性是其可以将包含numpy中数据结构对象的复杂对象,兼容性地转换为JSON中的数组,配合option=orjson.OPT_SERIALIZE_NUMPY即可:

- OPT_SERIALIZE_UUID
除了可以自动序列化numpy对象外,orjson还支持对UUID对象进行转换,在orjson 3.0之前的版本中,需要配合option=orjson.OPT_SERIALIZE_UUID,而本文演示的3.X版本则无需额外配置参数:

- OPT_SORT_KEYS
通过配合参数option=orjson.OPT_SORT_KEYS,可以对序列化后的结果自动按照键进行排序:

- 组合多种option
当你的序列化操作需要涉及多种option功能时,则可以使用|运算符来组合多个option参数即可:

2.4 针对dataclass、datetime添加自定义处理策略
当你需要序列化的对象中涉及到dataclass自定义数据结构时,可以配合orjson.OPT_PASSTHROUGH_DATACLASS,再通过对default参数传入自定义处理函数,来实现更为自由的数据转换逻辑,譬如下面简单的例子中,我们可以利用此特性进行原始数据的脱敏操作:

类似的,针对datetime类型数据,我们同样可以配合OPT_PASSTHROUGH_DATETIME和自定义default函数实现日期自定义格式化转换:

orjson更多特性可前往官方仓库https://github.com/ijl/orjson了解更多~
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札137)orjson:Python中最好用的json库的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...
- (数据科学学习手札53)Python中tqdm模块的用法
一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...
- (数据科学学习手札54)Python中retry的简单用法
一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
随机推荐
- Vue UI 可视化项目管理界面
除了直接使用npm的命令进行安装脚手架的安装以外,我们还可以使用Vue提供的GUI方法vue ui来进行项目的构建以及安装 win+R powershell 打开终端 在一个干净的目录下输入命令 vu ...
- Java报错:Error creating bean with name 'testController': Injection of resource dependencies failed
报错如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testCo ...
- 高精度减法(C++实现)
高精度减法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式减法计算 注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数 原理基本上与高精度加法相同,仅 ...
- Java语言学习day01--6月28日
Java语言学习day01一:Java概述 1.Java语言发展史 任职于太阳微系统的 詹姆斯·高斯林 等人于1990年代初开发Java语言的雏形,最初被命名为 Oak ,目标设置在 家用电器等小型系 ...
- Visual Studio2019 F5调试程序时选择文件后调试控制台进程关闭问题
问题:Visual Studio2019 F5调试程序时选择文件后调试控制台进程关闭问题 解决方案: 修改Visual Studio 配置项 [工具]-[选项]-[项目和解决方案]-[Web项目]-[ ...
- C#/VB.NET 获取Excel中图片所在的行、列坐标位置
本文以C#和vb.net代码示例展示如何来获取Excel工作表中图片的坐标位置.这里的坐标位置是指图片左上角顶点所在的单元格行和列位置,横坐标即顶点所在的第几列.纵坐标即顶点所在的第几行.下面是获取图 ...
- vue动态路由实现原理 addRoute
vue新版router.addRoute基础用法 新版Vue Router中用router.addRoute来替代原有的router.addRoutes来动态添加路由.子路由 在添加子路由的时候 比如 ...
- HashMap源码理解一下?
HashMap 是一个散列桶(本质是数组+链表),散列桶就是数据结构里面的散列表,每个数组元素是一个Node节点,该节点又链接着多个节点形成一个链表,故一个数组元素 = 一个链表,利用了数组线性查找和 ...
- [AcWing 797] 差分
点击查看代码 #include<iostream> using namespace std; const int N = 1e5 + 10; int a[N], b[N]; void in ...
- victoriaMetrics中的一些Sao操作
victoriaMetrics中的一些Sao操作 快速获取当前时间 victoriaMetrics中有一个fasttime库,用于快速获取当前的Unix时间,实现其实挺简单,就是在后台使用一个goro ...