Python中最值得学习的第三方JSON库

上一篇 / 下一篇  2022-06-06 11:18:27

  我们在日常使用Python?的过程中,经常会使用json?格式存储一些数据,尤其是在web?开发中。而Python?原生的json?库性能差、功能少,只能堪堪应对简单轻量的json数据存储转换需求。

  而本文我要给大家介绍的第三方json库orjson?,在公开的各项基准性能测试中,以数倍至数十倍的性能优势碾压json、ujson、rapidjson、simplejson?等其他Python库,且具有诸多额外功能,下面我们就来领略其常用方法吧~
  orjson常用方法
  orjson 支持3.7到3.10 所有版本64位的Python ,本文演示对应的orjson 的版本为3.7.0 ,直接使用pip install -U orjson?即可完成安装。下面我们来对orjson中的常用方法进行演示:
  1. 序列
  与原生json?库类似,我们可以使用orjson.dumps()将Python?对象序列化为JSON?数据,注意,略有不同的是,orjson?序列化的结果并不是str?型而是bytes?型,在下面的例子中,我们对包含一千万个简单字典元素的列表进行序列化,orjson与json库的耗时比较如下:
  2. 反序列化
  将JSON?数据转换为Python?对象的过程我们称之为反序列化,使用orjson.loads()?进行操作,可接受bytes、str型等常见类型,在前面例子的基础上我们添加反序列化的例子:
  3. 丰富的option选项
  在orjson?的序列化操作中,可以通过参数option来配置诸多额外功能,常用的有:
  (1) OPT_INDENT_2
  通过配置option=orjson.OPT_INDENT_2?,我们可以为序列化后的JSON?结果添加2个空格的缩进美化效果,从而弥补其没有参数indent的不足:
  (2) OPT_OMIT_MICROSECONDS
  orjson.dumps()?可以直接将Python中datetime、time?等标准库中的日期时间对象转换成相应的字符串,这是原生json?库做不到的,而通过配置option=orjson.OPT_OMIT_MICROSECONDS,可以将转换结果后缀的毫秒部分省略掉:
  (3) OPT_NON_STR_KEYS
  当需要序列化的对象存在非数值型键时,orjson?默认会抛出TypeError?错误,这时需要配置option=orjson.OPT_NON_STR_KEYS来强制将这些键转换为字符型:
  (4) OPT_SERIALIZE_NUMPY
  orjson?的一大重要特性是其可以将包含numpy?中数据结构对象的复杂对象,兼容性地转换为JSON?中的数组,配合option=orjson.OPT_SERIALIZE_NUMPY即可:
  (5) OPT_SERIALIZE_UUID
  除了可以自动序列化numpy?对象外,orjson?还支持对UUID?对象进行转换,在orjson 3.0?之前的版本中,需要配合option=orjson.OPT_SERIALIZE_UUID?,而本文演示的3.X版本则无需额外配置参数:
  (6) OPT_SORT_KEYS
  通过配合参数option=orjson.OPT_SORT_KEYS,可以对序列化后的结果自动按照键进行排序:
  (7) 组合多种option
  当你的序列化操作需要涉及多种option?功能时,则可以使用|?运算符来组合多个option参数即可:
  4. 针对dataclass、datetime添加自定义处理策略
  当你需要序列化的对象中涉及到dataclass?自定义数据结构时,可以配合orjson.OPT_PASSTHROUGH_DATACLASS?,再通过对default参数传入自定义处理函数,来实现更为自由的数据转换逻辑,譬如下面简单的例子中,我们可以利用此特性进行原始数据的脱敏操作:
  类似的,针对datetime?类型数据,我们同样可以配合OPT_PASSTHROUGH_DATETIME?和自定义default函数实现日期自定义格式化转换:

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar