orjson显著提升json性能但需严格处理类型与输入:仅接受bytes、不支持default/object_hook、datetime等须预转换、错误信息精简但定位快、输出无空格且无indent选项。

orjson 能显著提升 JSON 解析和序列化速度,但必须处理好字节输入、类型限制和错误行为差异,否则会直接抛异常或静默失败。
orjson.loads() 只接受 bytes,不支持 str
内置 json.loads() 接收 str 或 bytes,而 orjson.loads() 严格只接受 bytes。传入字符串会报 TypeError: expected bytes, not str。
- 正确做法:用
.encode("utf-8")显式转字节,例如orjson.loads(data.encode("utf-8")) - 读文件时别用
open(..., "r"),改用open(..., "rb")直接获取bytes - HTTP 响应体(如
response.content)通常是bytes,可直传;但response.text是str,需先编码
orjson 不支持自定义 encoder 和 object_hook
orjson 为性能舍弃了扩展性:不提供 default 参数,也不支持 object_hook 或 object_pairs_hook。所有非标准类型(如 datetime、Decimal、自定义类)默认无法序列化或反序列化。
- 序列化含
datetime的数据?必须提前转换,例如用isoformat()或int(timestamp()) - 需要自动处理
dataclass或pydantic.BaseModel?得在调用orjson.dumps()前手动调用.dict()或.model_dump() - 反序列化后想转成特定类实例?只能在
orjson.loads()后额外写转换逻辑,不能靠钩子函数
错误信息更少,但定位更快
orjson 报错时不返回详细行号或列号,只给一个偏移位置(IndexError: parse error at offset 123),乍看不如内置 json 友好。但实际调试中,这个偏移配合 data[120:130] 一眼就能看到坏字符。
- 遇到解析失败,先用
print(repr(data[max(0, 123-5):123+5]))查看上下文 - 常见原因:JSON 中混入了 Python 风格的单引号、注释、尾随逗号(
orjson严格遵循 RFC 8259) - 不想改数据源?临时切回
json.loads()做兼容,但注意性能损失可能达 3–5 倍
dump 出来的 bytes 默认不带空格,且无 indent 选项
orjson.dumps() 总是输出紧凑格式(no whitespace),不支持 indent、separators 等美化参数。如果需要可读性输出,得自己 post-process 或换回内置 json。
- 日志或调试时想看格式化 JSON?加一层
json.loads()+json.dumps(indent=2),但仅限开发环境 - 生产 API 返回必须紧凑?这反而是优势,省去空格节省带宽和解析时间
- 注意:
orjson.dumps()返回bytes,若要转str必须显式.decode("utf-8"),别漏掉
最易被忽略的一点:orjson 编译时依赖 SIMD 指令集,某些旧 CPU 或 Alpine Linux 容器里可能 fallback 到纯 Python 实现,性能下降明显。上线前务必在目标环境运行 python -c "import orjson; print(orjson.__version__)"; orjson.dumps({"a":1}) 验证是否真加速了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











