orjson性能是标准json的2–6倍,但需严格匹配bytes输入/输出、显式启用datetime/uuid支持,且缓存仅针对重复键名;fastapi中需重写jsonresponse.render()才能生效。

orjson 能把 JSON 解析速度提至标准 json 模块的 2–6 倍,但直接替换会出错——它不接受 str 输入,也不返回 str,且默认不处理 datetime 等类型,除非显式启用选项。
orjson.loads 只接受 bytes,传 str 会报 TypeError: expected bytes, received str
标准 json.loads() 接受 str 或 bytes,而 orjson.loads() 严格只认 bytes。这是性能优化的代价:跳过 UTF-8 解码步骤,直接解析原始字节流。
- 错误写法:
orjson.loads('{"a": 1}') → TypeError - 正确写法:先 encode,或从文件/网络读取时用
rb模式orjson.loads(b'{"a": 1}')或orjson.loads(f.read())(f = open(..., "rb")) - 若已有
str,必须手动转:orjson.loads(s.encode("utf-8")),但会抵消部分性能优势
orjson.dumps 默认返回 bytes,不是 str,且不自动处理 datetime/UUID
orjson.dumps() 总是返回 bytes,不像 json.dumps() 默认返回 str。同时,它对非 JSON 原生类型(如 datetime、UUID、dataclass)完全拒绝,除非加 option 参数。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 基础用法:
data = orjson.dumps({"x": 42})→ 得到b'{"x":42}',需显式.decode("utf-8")才能当字符串用 - 要支持
datetime:必须加option=orjson.OPT_NAIVE_UTC(假设本地时区)或orjson.OPT_OMIT_MICROSECONDS等组合 - 要支持
UUID:需配合orjson.OPT_UUID_HEX或自定义default函数(注意:orjson不支持default回调,只能靠内置 option 或预处理)
缓存机制只作用于键名,不缓存整个 JSON 对象
orjson 的“内存缓存”不是你理解的“缓存解析结果”,而是针对 JSON 对象中重复出现的字段名(如 thousands 个 "id"、"name")做字符串引用复用。它用 CachedKey + 2048 项 LRU 风格哈希表加速键匹配,对值内容、嵌套结构、对象数量无缓存效果。
- 适合场景:大量同构对象(如日志列表、API 返回数组),字段名高度重复
- 不适合场景:每次解析的 JSON 结构都不同,或字段名随机(如用户自定义 schema)
- 无法关闭或调优该缓存——它是硬编码的全局单例,容量固定为 2048,算法不可配
FastAPI / Pydantic 场景下替换需绕过默认序列化链
在 FastAPI 中直接 import orjson 并不自动生效。FastAPI 默认走 Pydantic 的 .json() 或内部 json.dumps(),不会调用 orjson。必须重写响应渲染逻辑。
- 推荐做法:继承
JSONResponse,重写render()方法,内部用orjson.dumps() - 关键细节:Pydantic 模型需先调
.dict()或.model_dump()(v2),再交给orjson.dumps();不能传模型实例直出 - 避坑点:若用了
orjson.OPT_SERIALIZE_NUMPY,确保 NumPy 数组已安装,否则运行时报AttributeError
最常被忽略的是输入类型契约——orjson.loads() 的 bytes 强制要求和 orjson.dumps() 的零回调设计,让很多“一键替换”尝试在第一行就失败。别把它当成 drop-in 替代,而要当作一个需要适配数据流转路径的新协议。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










