PythonのJSON処理を劇的に高速化!「orjson」の使い方とメリットを徹底解説

投稿者: | 2026-08-08

みなさん、こんにちは。 Web APIの開発やデータ分析などで、JSONデータの読み書き(エンコード・デコード)を行う機会はとても多いですよね。Pythonには標準で `json` モジュールが用意されていますが、「もっと処理を高速化したい」「大量のデータを一瞬で捌きたい」と思ったことはありませんか? そこで今回は、Python向けに提供されている超高速なJSONライブラリ「orjson」をご紹介します。Rustで実装されたこのライブラリを使えば、驚くほどのパフォーマンス向上が期待できますよ。

orjsonとは?

orjson は、Pythonのための高速かつ正確なJSONライブラリです。バックエンドがRustで実装されており、Pythonの標準 json モジュールや、他のサードパーティ製ライブラリ(ujsonrapidjson など)と比較しても、圧倒的な処理速度を誇ります。

Web APIの構築時など、レスポンス速度を極限まで高めたいときに大活躍してくれますよ。

orjsonの主なメリット

  • 圧倒的なパフォーマンス: ベンチマークテストにおいて、標準の json モジュールに比べて数倍から、場合によっては十数倍以上高速に動作します。
  • 多様な型へのネイティブ対応: 標準の json ではエラーになってしまう datetime オブジェクトや、UUIDdataclasses、さらには 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') のようにデコードして使用してくださいね。