python小课——零基础入门——学习笔记大数据 爬虫Python AI Sql

全方位盘点Python 中 6 款 JSON 库,不容错过!

2021-04-06  本文已影响0人  朱朱Python

REST API 是 在全世界使用标准化的消息格式。JSON 是互联网上数据交换的基石,作为 JavaScript 的一个子集,它从一开始就获得了巨大的推广。它特别清晰易读的语法也有利于推广。

据我所知各种语言都有 JSON 库用于序列化和反序列化。实际上在 Python 中就有很多种 JSON 库。在下文中,我将为大家比较它们的异同。

引用库

CPython 本身具有一个 json 模块。它最初是由 Bob Ippolito 作为 simplejson 开发的,并被合并到 Python 2.4 中(源代码)。CPython 遵循 Python 软件基金会(Python Software Foundation)许可协议。

simplejson 仍然作为一个单独的库存在,你可以通过 pip 安装它。它是带有可选 C 扩展的纯 Python 库。Simplejson 遵循 MIT 和 Academic Free License(AFL)许可协议。

ujson 是对 C 语言库 Ultra JSON 的绑定。Ultra JSON 由 ESN(一家电子艺术工作室公司)开发,并获得了 3条款BSD许可。Ultra JSON 在 Github 上拥有 3k 星,305 个 fork,50 个贡献者,最近一次提交的日期只有 12 天,而最后一次提交是在 5 天之前发布的。我听说它处于“维护模式”(来源),表明没有新的进展。

pysimdjson 是对 C ++ 库 simdjson 的绑定。SIMDjson 从加拿大获得资助。simdjson 在 Github 上有 12.2k 颗星,611 个分支,63 个贡献者,最后一次提交是 11 小时前,而最后一个 issue 是 2 小时前创建的。

python-rapidjson 是对 C ++ 库 RapidJSON 的绑定。RapidJSON 由 腾讯 开发。RapidJSON 在 GitHub 上有 9.8k 个星,2.7k 个 fork,150 个贡献者,最近一次提交大约在 2 个月前,而最后一个 issue 是 17 天前创建的。

orjson 是一个 Python 软件包,依靠 Rust 来完成繁重的工作。

成熟度和操作安全性

上面所有提到的库都可以毫无问题地用作 benchmark 示例,切换 JSON 模块也不是什么大问题,但我仍然想确定相关模块是否支持。

CPython,simplejson,ujson 和 orjson 都认为他们自己已经可以投产了。

python-rapidjson 将自身标记为 alpha,但是一位维护人员说这是一个错误,并将很快得到修复(资源)。

1.jpg

问题

判断一个库的问题是否能够被顺利解决,一个直接的方式是直接去它的仓库创建 issue,并观察后续的跟进反馈:

通过以上操作我得出一个答案,它们基本上没有相互关系。

基准测试(Benchmark)

为了正确地对不同的库进行基准测试,我考虑了以下情况:

反序列化速度

我将我的硬盘驱动器的读取速度设置了一个较低的上限,在以下3个图表中将以它作为基准。

2.jpg
3.jpg
4.jpg
5.jpg
6.jpg

由此得出的结论是:

序列化速度

在这里,我预先创建了 JSON 字符串,并以写入磁盘的时间作为基线测量了所需的时间。


7.jpg
8.jpg
9.jpg
10.jpg

我由此得出的结论是:

专业的 JSON 工作流

最后总结一下,我想指出一些我之前看到并记录下来的问题:

pydantic 是一个超级有用的验证库。你可以使用自己喜欢的 JSON 库将 JSON 字符串解析为带有 字典/列表/字符串/数字/布尔值的 Python 基本表示形式,然后再使用 Pydantic 对其进行解析。这样做的好处是你知道以后要处理的内容。不再只是将 Dict[str, Any] 用作 type annotation,不再用没用的的编辑器自动完成,不再检查属性是否在整个代码中都存在。

要引入除默认 json 以外的其他 json 包,我建议使用此模式

image.png

对于 Flask,你可以使用其他 编码器/解码器,如下所示:

image.png

今天的内容就到这里啦,希望这篇文章对你有所帮助,喜欢不要忘记收藏、转发、评论,点点关注哦!

上一篇 下一篇

猜你喜欢

热点阅读