
みなさん、こんにちは。 Web APIの開発やデータ分析などで、JSONデータの読み書き(エンコード・デコード)を行う機会はとても多いですよね。Pythonには標準で `json` モジュールが用意されていますが、「もっと処理を高速化したい」「大量のデータを一瞬で捌きたい」と思ったことはありませんか? そこで今回は、Python向けに提供されている超高速なJSONライブラリ「orjson」をご紹介します。Rustで実装されたこのライブラリを使えば、驚くほどのパフォーマンス向上が期待できますよ。
orjsonとは?
orjson は、Pythonのための高速かつ正確なJSONライブラリです。バックエンドがRustで実装されており、Pythonの標準 json モジュールや、他のサードパーティ製ライブラリ(ujson や rapidjson など)と比較しても、圧倒的な処理速度を誇ります。
Web APIの構築時など、レスポンス速度を極限まで高めたいときに大活躍してくれますよ。
orjsonの主なメリット
- 圧倒的なパフォーマンス: ベンチマークテストにおいて、標準の
jsonモジュールに比べて数倍から、場合によっては十数倍以上高速に動作します。 - 多様な型へのネイティブ対応: 標準の
jsonではエラーになってしまうdatetimeオブジェクトや、UUID、dataclasses、さらにはnumpyのデータ型などを、特別な設定なしでそのままシリアライズ(エンコード)できます。 - 厳格なUTF-8準拠: 常にUTF-8でエンコードおよびデコードを行うため、文字化けのリスクが低く、モダンなWebアプリケーション開発に最適です。
インストール方法
pip を使って簡単にインストールできます。
pip install orjsonサンプルコードで学ぶ使い方
基本的なエンコード(PythonオブジェクトをJSONに変換)とデコード(JSONをPythonオブジェクトに変換)の方法を見てみましょう。
import datetime
from dataclasses import dataclass
import orjson
# 1. 基本的なエンコードとデコード
data = {
"name": "みーちゃん",
"age": 17,
"skills": ["Python", "Rust", "TypeScript"],
"is_active": True
}
# エンコード(バイト列が返されます)
json_bytes = orjson.dumps(data)
print(f"エンコード結果 (bytes): {json_bytes}")
# デコード
decoded_data = orjson.loads(json_bytes)
print(f"デコード結果 (dict): {decoded_data}")
# 2. datetimeオブジェクトやdataclassesのシリアライズ
@dataclass
class User:
id: int
name: str
special_data = {
"user": User(id=1, name="Mee-chan"),
"created_at": datetime.datetime.now(datetime.timezone.utc)
}
# オプション指定
serialized = orjson.dumps(special_data, option=orjson.OPT_NAIVE_UTC)
print(f"特殊データのエンコード結果: {serialized.decode('utf-8')}")エンコード結果 (bytes): b'{"name":"\xe3\x81\xbf\xe3\x83\xbc\xe3\x81\xa1\xe3\x82\x83\xe3\x82\x93","age":17,"skills":["Python","Rust","TypeScript"],"is_active":true}'
デコード結果 (dict): {'name': 'みーちゃん', 'age': 17, 'skills': ['Python', 'Rust', 'TypeScript'], 'is_active': True}
特殊データのエンコード結果: {"user":{"id":1,"name":"Mee-chan"},"created_at":"2026-08-03T13:17:09.751305+00:00"}dumpsの戻り値がbytes型なのは、ファイル書き込みやネットワーク送信のパフォーマンスを最大化するためなんですよ。
みーちゃんのワンポイント
orjson.dumps() はパフォーマンスを極限まで高めるために、Pythonの文字列(str)ではなくバイト列(bytes)を返します。もしWebフレームワーク以外で文字列として扱いたい場合は、必ず serialized.decode('utf-8') のようにデコードして使用してくださいね。
