FORMAT COMPARISON
Protocol Buffers schema vs JSON
Protocol Buffersは`.proto`スキーマから型付きメッセージを定義し、field numberを使うバイナリwire形式と、別仕様のProtoJSONを提供します。JSONはRFC 8259の汎用テキスト形式で、特定のスキーマを前提にしません。
Protocol Buffers schemaとJSON、どちらを選ぶ?
RPCやサービス間で型定義とバイナリwire互換性を管理するならProtobufを選びます。任意のデータ構造をテキストで扱い、汎用JSONツールと接続するならJSONが扱いやすい候補です。ProtobufメッセージのJSON表現を使う場合は通常のJSONではなくProtoJSONのマッピングと互換性制約を確認してください。
Protocol Buffers schema向き
Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約
- protocで各言語のコードを生成する
- RPCやサービス間通信のメッセージを定義する
JSON向き
Web API・設定ファイル・データ交換
- 構造化データの受け渡し
基本情報を比較
Protocol Buffers schemaとJSONの主な違いを確認できます。
| 項目 | Protocol Buffers schema | JSON |
|---|---|---|
| 拡張子 | .proto | .json |
| MIME Type | text/plain | application/json |
| 主な用途 | Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約 | Web API・設定ファイル・データ交換 |
| 圧縮 | none | 該当なし |
| 開く方法 | テキストエディタやProtocol Buffers対応IDEで開きます。構文やimportを検証するには、プロジェクトが使うprotocと同じ版・設定でコンパイルします。 | テキストエディタ、IDE、JSON対応ビューアで開けます。 |
| 書き出し・変換 | 別スキーマ形式へ移す場合、型・フィールド番号・省略値・列挙値・互換性の意味を対応付けてからコード生成と実データのテストを行います。.protoをJSONやバイナリへ単純に拡張子変更しても変換されません。 | アプリケーションや変換ツールでCSVなどへ変換できます。 |
用途別の選び方
作りたいものや使う場面から選べます。
protocで各言語のコードを生成する
Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約
Protocol Buffers schema向きRPCやサービス間通信のメッセージを定義する
Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約
Protocol Buffers schema向き構造化データの受け渡し
Web API・設定ファイル・データ交換
JSON向き確認ポイント 1
Protobufバイナリwire形式は`.proto`定義とfield numberを前提にします。JSONはテキストのobject/array等を表し、構文上データスキーマを要求しません。ProtoJSONはProtobuf型をJSON値へ写す別の規則です。
使い分け確認ポイント 2
ProtoJSONはbytesをbase64文字列、int64を文字列、enumを名前等で表し、field nameをJSON keyへ変換します。これらは通常のProtobufバイナリ符号化や任意のJSON schemaと同一ではありません。
使い分け選ぶ理由を詳しく
- Protobuf wireデータとProtoJSONは未知フィールドの保持やスキーマ進化の性質が異なります。通常のJSONをProtobufへ変換する場合も、field presence、null、整数範囲、数値精度、unknown field、enum名、map key、oneofを検証してください。