您现在的位置是:亿华云 > 数据库

orjson:功能丰富的高性能 Python JSON 库

亿华云2025-10-05 07:11:02【数据库】2人已围观

简介简介首先我们先来了解下orjson的优缺点:可以将datetime、date和time实例序列化为RFC 3339格式,例如:"2022-06-12T00:00:00+00:00"序列化numpy.n

简介

首先我们先来了解下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的丰富速度是云南idc服务商其他库的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)])))

输出为: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]序列化Int类型

orjson可以对整数进行序列化和反序列化。云服务器提供商但web浏览器只支持53-bit的整数,当值超过53-bit时会产生JSONEncodeError。

>>> import orjson

>>> orjson.dumps(9007199254740992)

b9007199254740992

>>> 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 rangenumpy

序列化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]]str

orjson只处理UTF-8格式的字符串,如果给orjson.dumps()方法传入一个UTF-16的字符串,会产生报错。

>>> import orjson

>>> orjson.dumps(\ud800)

JSONEncodeError: str is not valid UTF-8: surrogates not alloweduuid

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"

安装

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

使用

基本使用

我们首先使用orjson序列化一个字典,云服务器随后再将结果反序列化:

import orjson, datetime, numpy

data = {

"type": "job",

"created_at": datetime.datetime(2022, 6, 12),

"status": "

很赞哦!(2)