新着記事を見逃さないには?
このブログ一覧をブックマークし、ホームやツール一覧のガイド欄もご覧ください。記事の閲覧に登録やメール購読は不要です。
Python の JSON 実務で重要なポイントを整理。datetime の変換、ensure_ascii=False による多言語出力、GB級データのストリーミング読込、orjson/ujson の選び方まで解説します。
Python の API 開発やデータ基盤では、JSON は最も一般的な交換形式です。ですが本番では、datetime、日本語を含む多言語文字列、巨大ファイルといった要件でつまずきやすくなります。
このガイドでは、実務で再利用しやすい形で次を整理します。
loads/dumps と load/dump の使い分けdatetime シリアライズの安定実装ensure_ascii=False による可読な出力json / orjson / ujson の選定基準loads/dumps と load/dumpjson.dumps(obj): Python オブジェクト -> JSON 文字列json.loads(text): JSON 文字列 -> Python オブジェクトjson.dump(obj, file): Python オブジェクト -> ファイルへ出力json.load(file): ファイル -> Python オブジェクト覚え方は、s 付きは string です。
datetime がシリアライズできない問題よくあるエラー:
from datetime import datetime
import json
json.dumps({"now": datetime.now()})
# TypeError: Object of type datetime is not JSON serializable実務ではエンコーダを一箇所にまとめると保守しやすくなります。
from datetime import datetime, date
import json
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, date):
return obj.isoformat()
return super().default(obj)
payload = {"now": datetime.now(), "today": date.today()}
print(json.dumps(payload, cls=DateTimeEncoder, ensure_ascii=False, indent=2))固定フォーマットが必要なら strftime(...) に置き換えます。
\uXXXX になる理由json.dumps() は既定で非 ASCII 文字をエスケープします。
import json
print(json.dumps({"message": "こんにちは、世界"}))
# {"message": "\u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c"}可読性を優先する場合:
import json
print(json.dumps({"message": "こんにちは、世界"}, ensure_ascii=False))ファイル出力は UTF-8 指定をセットで行います。
with open("data.json", "w", encoding="utf-8") as f:
json.dump({"message": "こんにちは、世界"}, f, ensure_ascii=False)巨大配列を json.load() で一括読み込みすると、メモリ圧迫が起きやすくなります。
.jsonl)を優先import json
def read_jsonl(path):
with open(path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
yield json.loads(line)
for obj in read_jsonl("events.jsonl"):
passijsonpip install ijsonimport ijson
def iter_huge_array(path):
with open(path, "rb") as f:
for item in ijson.items(f, "item"):
yield itemjson / orjson / ujson の使い分けjson(標準ライブラリ): 互換性重視、依存追加なしorjson: 高速性重視のホットパス向けujson: 置換しやすいが、境界ケースの検証は必要orjson の最小例:
import orjson
from datetime import datetime
data = {"name": "Alice", "now": datetime.now()}
raw = orjson.dumps(data) # bytes
obj = orjson.loads(raw)loads/dumps、ファイルは load/dumpensure_ascii=False を基本にいずれもブラウザ内ローカル処理のため、入力データはサーバーに送信されません。
開発者に最高のJSON処理ツールを提供することに専念
さらに多くの投稿が近日公開予定...
ブログに戻る更新の追い方、扱うトピック、リクエストについて。
このブログ一覧をブックマークし、ホームやツール一覧のガイド欄もご覧ください。記事の閲覧に登録やメール購読は不要です。
JSON の検証・整形・変換・デバッグの流れと JSON Work の更新で、サイト上の無料ツールがブラウザ内でできることと対応づけています。
はい。About の連絡先や GitHub からどうぞ。実務の統合やデバッグに直結するテーマを優先しています。