Python高性能JSON库orjson详解:从基础序列化到高级选项配置
本文深入解析Python第三方库orjson,其在基准测试中性能远超原生json及ujson等库。文章详细演示了dumps与loads的基础用法,并重点介绍OPT_INDENT_2、OPT_SERIALIZE_NUMPY等高级Option配置,以及如何通过default参数处理dataclass和datetime对象,帮助开发者实现高效、灵活的数据转换。
1 简介
在Python日常开发,尤其是Web应用构建中,JSON格式常被用于数据存储与交换。然而,Python内置的json库在性能上表现平平,功能也较为单一,仅能勉强满足轻量级场景的需求。

本文重点介绍一款第三方JSON库orjson。在多项公开基准测试中,orjson凭借数倍乃至数十倍的性能优势,显著优于json、ujson、rapidjson及simplejson等其他Python库,同时具备丰富的扩展功能。接下来我们将详细探讨其常用方法。
2 orjson常用方法
orjson兼容Python 3.7至3.10的所有64位版本。本文演示所用orjson版本为3.7.0,用户可通过执行pip install -U orjson命令完成安装。随后,我们将对orjson的核心功能进行演示。
2.1 序列化
与原生json库类似,orjson提供dumps()函数将Python对象序列化为JSON数据。不同之处在于,orjson序列化后的结果类型为bytes而非str。以下示例对比了包含一千万个简单字典元素的列表在orjson与json库中的序列化耗时,结果显示orjson具有明显速度优势。

2.2 反序列化
将JSON数据还原为Python对象的过程称为反序列化,可通过orjson.loads()实现。该函数接受bytes或str等常见类型。在前述序列化示例基础上,我们补充反序列化的操作演示。

2.3 丰富的option选项
在orjson的序列化操作中,可通过option参数配置多种额外功能,常用选项包括:
- OPT_INDENT_2
设置option=orjson.OPT_INDENT_2可为序列化后的JSON结果添加两空格缩进,实现美化效果,从而弥补其原生不支持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函数,可实现日期的自定义格式化转换。

总结
至此,关于Python中高性能JSON库orjson的用法介绍完毕。如需了解更多Python JSON库相关技巧,欢迎查阅本站往期文章或继续浏览后续内容。感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













