アプリ間でデータをやり取りするとき、よく聞くのが JSON と Protocol Buffers(Protobuf) です。
どちらも便利ですが得意分野が違います。
本記事では、基本の違いから比較ポイント、使い分けの考え方、そして始め方までを初心者向けに丁寧に解説します。
Protocol Buffers(Protobuf) と JSON の基本と違い
Protobuf とは?
概要
Protobuf は Google が作ったデータ表現方式で、あらかじめ決めたスキーマに従ってデータをバイナリ形式でコンパクトに表現します。
スキーマをもとに各言語のコードを自動生成できるため、型がはっきりした安全なやり取りがしやすいことが特徴です。
主な用途
gRPC という高速な RPC(リモート呼び出し)と一緒に使われることが多く、サーバー間通信やモバイル/IoT の省データ通信で力を発揮します。
サイズと速度を重視する場面に向いています。
ミニ例
以下はユーザー情報のシンプルな定義例です。
各フィールドには型と番号が付くのがポイントです。
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
}
JSON とは?
概要
JSON はテキストベースのデータ形式で、人間が読んで理解しやすく、ほぼすべてのプログラミング言語で扱いやすいのが特徴です。
Web API で広く使われ、学習コストが低いことも魅力です。
主な用途
ブラウザや外部サービスとの通信、ログや設定ファイルなど、人間が目で確認したいデータに向いています。
まずは JSON から始めるという選択は実務でとても一般的です。
ミニ例
{
"id": 123,
"name": "Alice"
}
このようにキーと値で素直に書けるため、最初の一歩として扱いやすいです。
テキストかバイナリかの違い
読みやすさ vs 効率
JSON はテキストなのでエディタで開けば中身がすぐ分かりますが、Protobuf はバイナリなので直接読むことは難しいです。
可読性は JSON、有効な圧縮と高速性は Protobuf が得意というイメージで捉えると分かりやすいです。
バイナリをそのままコピペしても読めません。
スキーマが必要かどうか
ルールの有無
Protobuf は .proto というスキーマ定義が必須です。
スキーマがあることで、データの形が崩れにくく、間違いを早期に発見できます。
JSON はスキーマがなくても使えますが、JSON Schema を使ってルールを追加することもできます。
進化のさせ方
Protobuf は後方互換に注意すれば安全に進化できますが、フィールド番号を変えるのは厳禁です。
一度公開した番号は変えない・再利用しないのが基本です。
JSON は柔軟ですが、その分「値が来たり来なかったり」するゆるさに注意します。
データの型と構造の扱い
型の厳密さ
Protobuf は int32、int64、bool、string、bytes、enum など型が豊富で、意図した型で厳密にやり取りできます。
JSON の number は整数と小数を区別しないため、言語によって扱いが変わることがあります。
構造表現
Protobuf は repeated(配列)や map、入れ子のメッセージ、oneof などを備え、複雑な構造でもコンパクトに表現できます。
JSON もオブジェクトと配列で柔軟に表せますが、厳密な制約は自動では付きません。
Protobuf と JSON の比較ポイント
速度と処理の軽さ
概観
Protobuf はバイナリかつ自動生成コードで処理するため、シリアライズとデシリアライズが高速になりやすいです。
JSON は文字列の解析が必要で、同条件なら一般に遅くなりますが、多くのアプリでは問題にならない速度です。
データサイズ
概観
Protobuf は同じデータをより小さく表せます。
ネットワーク帯域やストレージを節約したいときは Protobuf が有利です。
JSON も gzip などの圧縮と併用すればサイズを抑えられますが、ヘッダやキー名がそのまま載る分、基本的に大きくなります。
読みやすさとデバッグのしやすさ
概観
JSON は直接読めるので、目で見て確認しやすく、そのままログに書けるのが強みです。
Protobuf はツール(protoc の decode、各言語のデバッガ)が必要ですが、スキーマに沿って検証できる利点もあります。
多言語対応とツールの充実度
概観
両者とも多言語対応ですが、JSON はほぼ全言語で標準的に扱え、Protobuf はコンパイラとプラグインを使ってコード生成します。
セットアップの手間は JSON の方が小さく、Protobuf は一度整えると大規模開発で強みが出ます。
エラーの見つけやすさ
概観
JSON は自由度が高い分、間違いに気づくのが実行時になりがちです。
Protobuf はスキーマに反しないようコンパイル時や受信時に弾かれるため、不整合を早めに発見できる傾向があります。
学習コストと導入のしやすさ
概観
最初の一歩は JSON が圧倒的に楽です。
Protobuf はスキーマ設計やツール導入が必要ですが、慣れれば型安全や性能面の恩恵が得られます。
まとめ表
| 観点 | Protobuf | JSON | 一言まとめ |
|---|---|---|---|
| 速度 | 速いことが多い | 並程度 | 性能重視は Protobuf |
| サイズ | 小さい | 大きめ | 帯域節約は Protobuf |
| 可読性 | 低い(ツール必要) | 高い | デバッグ容易は JSON |
| スキーマ | 必須 | 任意(JSON Schema) | 型安全は Protobuf |
| 導入の手軽さ | 中〜高 | 低 | 最初は JSON でOK |
Protobuf と JSON の使い分け
まずは JSON で十分なケース
こんなときは JSON
初期プロトタイプ、フロントエンドと話す API、外部サービス連携、ログや設定ファイルなど、人が読んだり手で編集したりする前提なら JSON が便利です。
規模が小さいアプリでも扱いやすく、ツールなしで動かせます。
Protobuf が向くケース
こんなときは Protobuf
サーバー間で大量リクエスト、高頻度メッセージ、モバイル/IoT で帯域や電力を節約したい場合、Protobuf のコンパクトさと速度が役立ちます。
gRPC を採用すると相性が良く、ストリーミングや双方向通信も扱いやすくなります。
外部APIとの連携は JSON が基本
なぜ JSON なのか
多くの公開 API は HTTP+JSON を前提にしており、クライアントの実装が簡単で互換性が高いためです。
ブラウザやモバイル SDK でも標準的にサポートされ、ドキュメントも豊富です。
サーバー間のやり取りは Protobuf が有利なことも
内部通信の最適化
社内のマイクロサービス間では、スキーマで契約を固定しつつ高速・省容量で通信できる Protobuf が効果的です。
サービス数やトラフィックが増えるほど差が出ます。
ただし、チームが JSON に慣れているなら、まずは JSON で始めてから移行を検討しても問題ありません。
ログや設定は JSON が便利
人が読む前提
運用では目視確認や手修正が避けられません。
JSON は整形しやすく、jq などのツールで後処理も簡単です。
Protobuf でもテキストフォーマットはありますが、一般的ではなく学習コストが増えます。
モバイル/IoT など帯域が厳しいときは Protobuf
帯域・電池・速度のバランス
ネットワークが細い、送信回数が多い、電池消費を抑えたい、といった環境では、小さく速い Protobuf が通信と電力の負担を軽くします。
JSON でも圧縮は可能ですが、ヘッダや解析コストが積み重なります。
はじめ方と注意点
Protobuf の始め方
手順の全体像
まず protoc(コンパイラ)をインストールし、.proto にメッセージを定義します。
次に各言語向けプラグインでコードを生成し、生成物を使って送受信します。
gRPC を使う場合はサービス定義も .proto に含めます。
最小の例とコツ
- .proto を小さく始め、フィールド番号は将来を見据えて余裕を持たせます。公開後の番号変更はしないのが鉄則です。
- 迷ったら string を使いがちですが、数値や真偽は適切な型を選ぶと後が楽です。
JSON の基本ツールと確認方法
便利ツール
整形や検証には jq、各言語のフォーマッタ、VS Code の拡張などが便利です。
API の確認は curl や Postman で十分始められます。
スキーマが必要なら JSON Schema を段階的に導入します。
JSON と Protobuf の相互変換の考え方
基本の考え方
多くの Protobuf ライブラリは、メッセージを JSON に変換する機能を備えています(例: bytes は base64、enum は文字列、フィールド名は lowerCamelCase など)。
逆変換も可能ですが、未知フィールドや既定値の扱いに注意します。
注意点
デフォルト値(0 や空文字)は JSON に出ない設定の場合があります。
「無い」と「空」の違いに気づけるよう、必要なら明示的に出力する設定を選びます。
数値の桁あふれや浮動小数の丸めにも注意しましょう。
選び方チェックリスト
迷ったときの指針
| 質問 | 「はい」のとき | 「いいえ」のとき |
|---|---|---|
| 人が直接読んだり編集したいか | JSON を選ぶ | 他の条件で再判断 |
| 帯域や速度が厳しいか | Protobuf を優先 | JSON でも十分 |
| 外部の一般的な Web API と繋ぐか | JSON が基本 | 内部通信なら Protobuf 検討 |
| 型安全と契約(スキーマ)を重視するか | Protobuf が向く | JSON + JSON Schema も可 |
| 初期セットアップを最小にしたいか | JSON で開始 | ツール整備できるなら Protobuf |
迷うならまず JSON、性能や厳密さの必要が見えたら Protobuf を検討が実務では安全です。
よくあるつまずきと回避策
フィールド番号の再利用(Protobuf)
番号を消して別用途に使い回すと、古いクライアントで誤解釈されます。
使わなくなった番号は reserved にして再利用しないのが正解です。
既定値と欠落の区別
JSON では 0 と null、欠落の差が曖昧になりがちです。
必要なら明示的なフィールドを用意するか、スキーマで必須を定義します。
Protobuf でも presence の扱いに注意します。
数値の型ぶれ
JSON の number は言語によって 64bit 整数に収まらないことがあります。
大きな整数は文字列で送る、または Protobuf の int64 を使うなどの対策をとります。
デバッグのしづらさ(Protobuf)
バイナリは目視が難しいため、protoc の –decode や各言語のデバッグ表示を使うと楽になります。
学習初期は JSON 併用も有効です。
ツール導入のハードル
Protobuf の環境構築でつまずいたら、まずは最小の .proto と単一言語で成功体験を作るのが近道です。
その後に CI 連携やマルチ言語対応を広げます。
過度な最適化
最初から性能最優先で複雑化すると学習負担が増えます。
まずは JSON で正しさを固め、ボトルネックが出たら Protobuf を導入する段階的アプローチが現実的です。
まとめ
JSON は読みやすさと導入の容易さ、Protobuf は速度とサイズ、型安全さが大きな強みです。
人が読むなら JSON、内部で効率重視なら Protobuf と覚えると迷いにくく、まずは JSON で始めて必要に応じて Protobuf にシフトする流れが実務で成功しやすい形です。
チームのスキルや運用体制も加味しながら、「読めること」と「速いこと」のバランスを取り、最適な選択をしていきましょう。
