本文へスキップ

JSONスキーマからProtobuf定義への変換 — Numio

object 型の JSON Schema を proto2 の message 定義に変換します。フィールドはプロパティの順に番号が振られます。必須プロパティは "required"、それ以外は "optional"、配列は "repeated" になり、ネストしたオブジェクトはネストした message と、それを使うフィールドになります。

イベントの JSON Schema があり、gRPC や Kafka パイプライン向けに編集する .proto message のたたき台がほしい場合。

JSON Schema

Protobuf

こんなときに使えます

  • イベントの JSON Schema があり、gRPC や Kafka パイプライン向けに編集する .proto message のたたき台がほしい場合。
  • message を自分で書く前に、既存スキーマのスカラーフィールドがどの protobuf 型に対応するかを確認したい場合。

使い方

  1. ルートが "type": "object" の JSON Schema を貼り付けます。message 名は "title" を PascalCase にしたもの(または "name" キー)になり、どちらもなければ Root です。
  2. 変換はブラウザ内で行われます。設定項目はありません。
  3. Protobuf パネルから proto2 のテキストをコピーし、.proto ファイルで使う前に型を確認します。

JSON Schema

{
  "title": "Order",
  "type": "object",
  "properties": {
    "id": { "type": "string" },
    "quantity": { "type": "integer" },
    "price": { "type": "number" },
    "paid": { "type": "boolean" },
    "tags": { "type": "array", "items": { "type": "string" } },
    "shipping": { "type": "object", "properties": { "city": { "type": "string" } } }
  },
  "required": ["id", "quantity"]
}

Protocol Buffers (proto2)

syntax = "proto2";

message Order {
  message Shipping {
    optional string city = 1;
  }

  required string id = 1;
  required int32 quantity = 2;
  optional double price = 3;
  optional bool paid = 4;
  repeated string tags = 5;
  optional Shipping shipping = 6;
}

仕様と制限

変換はサイト独自のコンバーターによりブラウザ内で行われ、スキーマはサーバーに送信されません。

integer は int32(format が int64 の場合や 32 ビットの範囲を超える境界値がある場合は int64)、number は double(format が float なら float)、boolean は bool になります。配列の要素型も同じ規則で対応付けられます。

文字列の enum は接頭辞付き UPPER_SNAKE の値を持つネストした enum に、additionalProperties のスキーマは map<string, T> になります。definitions や $defs へのローカルな $ref はトップレベルの message を指します。

配列の配列、null 以外の分岐が複数ある oneOf/anyOf、型のないプロパティは string にフォールバックします。別ファイルへの $ref はエラーになります。

FAQ

proto3 を生成できますか?

いいえ。出力は常に syntax = "proto2" で始まり、required/optional ラベルを使います。

message 名はどう決まりますか?

ルートの "title" を PascalCase にしたもの("Example Schema" なら ExampleSchema)、または "name" キーから決まります。どちらもなければ Root です。ネストした message と enum はプロパティ名から命名されます。

["string", "null"] のような null 許容フィールドはどう扱われますか?

null の部分は除かれ、残りの型が使われます。たとえば ["number", "null"] は optional double height になります。proto2 の optional フィールドはもともと省略可能です。

スキーマはアップロードされますか?

いいえ。このページはブラウザ内でスキーマを変換し、サーバーの API を呼び出しません。

仕様を確認する