在 Python 中,`orjson` 和标准库的 `json` 模块都用于 JSON 数据的序列化和反序列化,但它们在性能、功能和使用方式上有显著差异。以下是它们的区别及 `orjson` 的使用示例:
主要区别
特性 | json (标准库) | orjson (第三方库) |
---|---|---|
性能 | 较慢(纯 Python 实现) | 极快(Rust 实现,优化了内存和速度) |
支持的数据类型 | 基本类型(需自定义处理复杂类型) | 自动支持 datetime 、UUID 、numpy 数组等 |
输出类型 | dumps 返回 str | dumps 返回 bytes (需用 decode() 转字符串) |
选项和配置 | 简单参数(如 indent , sort_keys ) | 丰富的选项(通过 option 参数组合启用) |
依赖 | 内置无需安装 | 需要安装:pip install orjson |
使用示例:orjson
1. 安装
pip install orjson
2. 基本序列化与反序列化
import orjson
data = {"name": "Alice", "age": 30, "skills": ["Python", "Rust"]}
# 序列化为 bytes
json_bytes = orjson.dumps(data)
print(json_bytes) # b'{"name":"Alice","age":30,"skills":["Python","Rust"]}'
# 反序列化
decoded_data = orjson.loads(json_bytes)
print(decoded_data["name"]) # Alice
3. 处理复杂数据类型(如 datetime
)
import orjson
from datetime import datetime
data = {"event": "Meeting", "time": datetime.now()}
# 自动序列化 datetime 对象
json_bytes = orjson.dumps(data)
print(json_bytes.decode()) # {"event":"Meeting","time":"2023-10-25T14:30:00Z"}
4. 使用选项美化输出
import orjson
data = {"a": 1, "b": 2, "c": 3}
# 启用缩进和键排序
json_bytes = orjson.dumps(
data,
option=orjson.OPT_INDENT_2 | orjson.OPT_SORT_KEYS
)
print(json_bytes.decode())
# 输出:
# {
# "a": 1,
# "b": 2,
# "c": 3
# }
5. 处理非 ASCII 字符
import orjson
data = {"message": "你好,世界!"}
# 默认直接序列化非 ASCII 字符(无需额外配置)
json_bytes = orjson.dumps(data)
print(json_bytes.decode()) # {"message":"你好,世界!"}
关键选项(option
参数)
OPT_INDENT_2
: 缩进 2 空格(类似json.dumps(indent=2)
)OPT_SORT_KEYS
: 按键排序输出OPT_NAIVE_UTC
: 将datetime
对象视为 UTC 时间OPT_SERIALIZE_NUMPY
: 支持numpy
数组序列化- 多个选项可通过
|
组合使用。
适用场景
- 高性能需求:如 API 服务器、大数据处理。
- 复杂数据类型:无需手动处理
datetime
或UUID
。 - 二进制友好场景:
orjson.dumps
直接返回bytes
,适合网络传输。
注意事项
orjson.dumps
返回bytes
而非str
,写入文件时需用二进制模式:with open("data.json", "wb") as f: f.write(orjson.dumps(data))
- 不支持所有 Python 对象(如自定义类),需通过
default
参数处理:class User: def __init__(self, name): self.name = name user = User("Bob") json_bytes = orjson.dumps(user, default=lambda obj: obj.__dict__)
总结:orjson
是追求性能和便捷性时的最佳选择,而 json
模块适合简单场景或无需安装第三方库的情况。