orjson序列化速度是标准json的10–13倍、反序列化4–5倍,值得替换;但需处理bytes返回、移除indent/default等参数,并适配datetime仅序列化不自动还原等问题。

直接换 orjson,序列化能快 10–13 倍,反序列化也能快 4–5 倍;但别无脑全局替换 import json,否则 TypeError: dumps() got an unexpected keyword argument 'indent' 会立刻报给你看。
orjson.dumps() 返回 bytes,不是 str
标准 json.dumps() 返回 str,而 orjson.dumps() 默认返回 bytes。下游代码如果直接拼接、写日志、或传给需要 str 的 HTTP 框架(比如某些中间件),会直接抛 TypeError。
- 适配方式:用
orjson.dumps(data).decode("utf-8")补回str类型(仅当必须字符串时) - 更优做法:让接收方支持
bytes——比如 FastAPI 的Response(content=..., media_type="application/json")就原生吃bytes - 注意
isinstance(res, str)这类类型检查,orjson.dumps()结果过不了
orjson 不支持 indent / default / sort_keys 等参数
orjson 为性能牺牲了调试友好性:它压根不接受 indent、default、sort_keys、ensure_ascii 等参数。调用时带这些,立刻报错。
- 日志调试需求:单独保留
json.dumps(..., indent=2),只在性能敏感路径切orjson - 自定义类型(如
datetime):orjson能自动序列化,无需default;但反序列化后仍是字符串,不会变回datetime对象 - 想格式化再输出?只能先
orjson.dumps(),再用json.loads()+json.dumps(..., indent=2)二次处理——但这就失去意义了
ujson 对 datetime 完全不兼容,且错误提示模糊
ujson.dumps({"ts": datetime.now()}) 会直接炸: TypeError: Object of type datetime is not JSON serializable。它不像 orjson 那样兜底,也不像标准 json 那样允许你用 default 补救。
- 所有含
datetime、Decimal、dataclass、自定义对象的字段,都得提前转成str或基本类型 - 错误信息不带位置偏移,出错时难定位是哪个 key 导致的
-
ensure_ascii=False可以开,能省掉 Unicode 转义开销,但输出是 raw UTF-8bytes,确认下游能正确 decode
FastAPI / Django 中集成 orjson 的关键点
框架默认走标准 json,硬切库不改集成逻辑,中间件或响应构造器可能因类型不匹配崩溃。
- FastAPI:用
from fastapi.responses import ORJSONResponse,并在路由中显式返回ORJSONResponse(content=data) - 或全局配置:在
app = FastAPI(default_response_class=ORJSONResponse)初始化时指定 - Django:需自定义
JsonResponse子类,重写render()方法,用orjson.dumps()替换json.dumps() - 别忘了检查中间件是否对
response.body做了str假设——很多日志中间件会在这里翻车
真正卡住迁移的,从来不是“哪个库更快”,而是 datetime 字段要不要还原、日志要不要格式化、下游系统认不认 bytes 响应——这些细节没对齐,再快的库也只会在上线后某个凌晨三点报错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











