发布时间:2023-10-02 10:00
大家好,我们在日常使用 Python
的过程中,经常会使用 json
格式存储一些数据,尤其是在 web
开发中。而 Python
原生的 json
库性能差、功能少,只能堪堪应对简单轻量的 json
数据存储转换需求。
而本文我要给大家介绍的第三方 json
库 orjson
,在公开的各项基准性能测试中,以数倍至数十倍的性能优势碾压 json
、 ujson
、 rapidjson
、 simplejson
等其他 Python
库,且具有诸多额外功能,下面我们就来领略其常用方法吧~
orjson
支持 3.7
到 3.10
所有版本64位的 Python
,本文演示对应的 orjson
的版本为 3.7.0
,直接使用 pip install -U orjson
即可完成安装。下面我们来对 orjson
中的常用方法进行演示:
与原生 json
库类似,我们可以使用 orjson.dumps()
将 Python
对象序列化为 JSON
数据,注意,略有不同的是, orjson
序列化的结果并不是 str
型而是 bytes
型,在下面的例子中,我们对包含一千万个简单字典元素的列表进行序列化, orjson
与 json
库的耗时比较如下:
将 JSON
数据转换为 Python
对象的过程我们称之为反序列化,使用 orjson.loads()
进行操作,可接受 bytes
、 str
型等常见类型,在前面例子的基础上我们添加反序列化的例子:
在 orjson
的序列化操作中,可以通过参数 option
来配置诸多额外功能,常用的有:
通过配置 option=orjson.OPT_INDENT_2
,我们可以为序列化后的 JSON
结果添加2个空格的缩进美化效果,从而弥补其没有参数 indent
的不足:
orjson.dumps()
可以直接将 Python
中 datetime
、 time
等标准库中的日期时间对象转换成相应的字符串,这是原生 json
库做不到的,而通过配置 option=orjson.OPT_OMIT_MICROSECONDS
,可以将转换结果后缀的毫秒部分省略掉:
当需要序列化的对象存在非数值型键时, orjson
默认会抛出 TypeError
错误,这时需要配置 option=orjson.OPT_NON_STR_KEYS
来强制将这些键转换为字符型:
orjson
的一大重要特性是其可以将包含 numpy
中数据结构对象的复杂对象,兼容性地转换为 JSON
中的数组,配合 option=orjson.OPT_SERIALIZE_NUMPY
即可:
除了可以自动序列化 numpy
对象外, orjson
还支持对 UUID
对象进行转换,在 orjson 3.0
之前的版本中,需要配合 option=orjson.OPT_SERIALIZE_UUID
,而本文演示的 3.X
版本则无需额外配置参数:
通过配合参数 option=orjson.OPT_SORT_KEYS
,可以对序列化后的结果自动按照键进行排序:
当你的序列化操作需要涉及多种 option
功能时,则可以使用 |
运算符来组合多个 option
参数即可:
当你需要序列化的对象中涉及到 dataclass
自定义数据结构时,可以配合 orjson.OPT_PASSTHROUGH_DATACLASS
,再通过对 default
参数传入自定义处理函数,来实现更为自由的数据转换逻辑,譬如下面简单的例子中,我们可以利用此特性进行原始数据的脱敏操作:
类似的,针对 datetime
类型数据,我们同样可以配合 OPT_PASSTHROUGH_DATETIME
和自定义 default
函数实现日期自定义格式化转换:
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
人脸识别精度提升 | 基于Transformer的人脸识别(附源码)
查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题
通过 docker 学习 nginx,附全部配置及 API 测试,可使用 apifox 直接打开
SpringCloud nginx 高并发核心编程【2020年11月新书 】
Elasticsearch深度应用(上) - 女友在高考 - 博客园
Docker技术:Harbor私服搭建使用以及私服推送和拉取镜像(附常见问题,server gave HTTP response to HTTPS client)