Python中最好用的json库orjson用法详解
作者:代码输入中... 发布时间:2023-06-13 23:11:49
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 函数实现日期自定义格式化转换:
来源:https://blog.csdn.net/m0_59485658/article/details/125138257


猜你喜欢
- 在前面文章中,有提到过 mysqldump 备份文件中记录的时间戳数据都是以 UTC 时区为基础的,在筛选恢复单库或单表时要注意时区差别。后
- 转换工具层出不穷,ffmpeg才是全能的转换工具,只是不支持图形操作。没有关系,命令行方式,在freebsd/linux下直接来我们的思路是
- vue自定义keepalive组件前一阵来了一个新的需求,要在vue项目中实现一个多开tab页面的功能,本来心想,这不简单嘛就是一个增加按钮
- 实现SQL Server 原生数据从XML生成JSON数据的实例代码 SQL Server 是关系数据库,查询结果通
- 互联网上的每台计算机都有独一无二的编号,称为IP地址,每个合法的IP地址由“.”分开的4个数字组成,并且IP地址细分类型的话,可以分为“A”
- 一、 背景介绍web应用采用的是ssh框架,数据库使用的sql server2014版本。二、问题:客户要求,ID列的数据类型必须是uniq
- 本文实例讲述了Python实现向服务器请求压缩数据及解压缩数据的方法。分享给大家供大家参考,具体如下:向服务器请求压缩数据格式,并解压缩数据
- 起步在 Django 的模型中新加了一个日期的字段:import datetimeclass Instance(models.Model):
- dictPython内置了字典:dict的支持,dict全称dictionary,在其他语言种也称为map,使用键-值(key-value)
- 简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。代码如下:import cv2 as
- 在网上有很多文章介绍数据库优化知识,但是大部份文章只是对某个一个方面进行说明,而对于我们程序员来说这种介绍并不能很好的掌握优化知识,因为很多
- Redo LogREDO LOG称为重做日志 ,当MySQL服务器意外崩溃或者宕机后,保证已经提交的事务持久化到磁盘中(持久性)。InnoD
- 一、新建项目:SqlSugarDemo<ItemGroup> <PackageReference
- 1. 创建一个图import networkx as nxg = nx.Graph()g.clear() #将图上元素清空所有的构建复杂网络
- ktime 开始时间串 dtime 到期时间串 jmonth 付费间隔月份数 可选(1,3,6,12) 需要 按月查询数据 比如说 ktim
- 图片的上传上传图片使用了表单提交, 下面是html部分, enctype="multipart/form-data"表示
- 是在客户端确认还是在服务器端确认? <SCRIPT LANGUAGE="VBSc
- 一般来说在 Python 中,为了解决内存泄漏问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收。由于Python 有了自动垃圾回收功
- web.py 是一个轻量级Python web框架,它简单而且功能强大。web.py 是一个Python 的web 框架,它简单而且功能强大
- 前言在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别