简介
首先我们先来了解下orjson的优缺点:
- 可以将datetime、date和time实例序列化为RFC 3339格式,例如:"2022-06-12T00:00:00+00:00"
- 序列化numpy.ndarray实例的速度比其他库快4-12倍,但使用的内存更少,约为其他库的1/3左右
- 输出速度是标准库的10到20倍
- 序列化的结果是bytes类型,而不是str
- 序列化str时,不会将unicode转义为ASCII
- 序列化float的速度是其他库的10倍,反序列化的速度是其他库的两倍
- 可以直接序列化str、int、list和dict的子类
- 不提供load( )和dump( )方法,在原生JSON库中,load( )方法可以把json格式的文件转换成python对象
- 序列化dataclass类型
import dataclasses, orjson, typing
@dataclasses.dataclass
class Member:
id: int
active: bool = dataclasses.field(default=False)
@dataclasses.dataclass
class Object:
id: int
name: str
members: typing.List[Member]
print(orjson.dumps(Object(1, "a", [Member(1, True), Member(2)])))
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
输出为:b'{"id":1,"name":"a","members":[{"id":1,"active":true},{"id":2,"active":false}]}'
- 序列化 float
orjson序列化和反序列化双精度浮点数,不会损失精度。当序列化NaN,Infinity,-Infinity时,会返回null。
>>> import orjson, ujson, rapidjson, json
>>> orjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
b'[null,null,null]'
>>> ujson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
OverflowError: Invalid Inf value when encoding double
>>> rapidjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
'[NaN,Infinity,-Infinity]'
>>> json.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
'[NaN, Infinity, -Infinity]'
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 序列化Int类型
orjson可以对整数进行序列化和反序列化。但web浏览器只支持53-bit的整数,当值超过53-bit时会产生JSONEncodeError。
>>> import orjson
>>> orjson.dumps(9007199254740992)
b'9007199254740992'
>>> orjson.dumps(9007199254740992, option=orjson.OPT_STRICT_INTEGER)
JSONEncodeError: Integer exceeds 53-bit range
>>> orjson.dumps(-9007199254740992, option=orjson.OPT_STRICT_INTEGER)
JSONEncodeError: Integer exceeds 53-bit range
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- numpy
序列化numpy数据需要设置option=orjson.OPT_SERIALIZE_NUMPY。
>>> import orjson, numpy
>>> orjson.dumps(
numpy.array([[1, 2, 3], [4, 5, 6]]),
option=orjson.OPT_SERIALIZE_NUMPY,
)
b'[[1,2,3],[4,5,6]]'
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- str
orjson只处理UTF-8格式的字符串,如果给orjson.dumps()方法传入一个UTF-16的字符串,会产生报错。
>>> import orjson
>>> orjson.dumps('\ud800')
JSONEncodeError: str is not valid UTF-8: surrogates not allowed
- 1.
- 2.
- 3.
- uuid
orjson可以把uuid.UUID实例序列化为RFC 4122格式。
>>> import orjson, uuid
>>> orjson.dumps(uuid.UUID('f81d4fae-7dec-11d0-a765-00a0c91e6bf6'))
b'"f81d4fae-7dec-11d0-a765-00a0c91e6bf6"'
>>> orjson.dumps(uuid.uuid5(uuid.NAMESPACE_DNS, "python.org"))
b'"886313e1-3b8a-5372-9b90-0c9aee199e5d"'
- 1.
- 2.
- 3.
- 4.
- 5.
安装
orjson支持3.7-3.10所有版本64位的Python,注意32位的 Python 无法使用orjson!本文将在3.8.2环境下使用orjson,使用以下命令安装orjson:
pip install --upgrade "pip>=20.3"
pip install --upgrade orjson
- 1.
- 2.
使用
- 基本使用
我们首先使用orjson序列化一个字典,随后再将结果反序列化:
import orjson, datetime, numpy
data = {
"type": "job",
"created_at": datetime.datetime(2022, 6, 12),
"status": "
标签:OPT,00,python,orjson,dumps,import,序列化
From: https://www.cnblogs.com/xingxia/p/python_orjson.html