Перейти к содержимому

Конвертировать схему JSON в определения Protobuf — Numio

Преобразует JSON Schema типа object в определение message proto2. Поля нумеруются в порядке свойств; обязательные свойства получают "required", остальные — "optional", массивы — "repeated", а вложенные объекты становятся вложенными message с полем, которое их использует.

У вас есть JSON Schema для события, и нужен черновик message в .proto для доработки под конвейер gRPC или Kafka.

JSON Schema

Protobuf

Когда пригодится

  • У вас есть JSON Schema для события, и нужен черновик message в .proto для доработки под конвейер gRPC или Kafka.
  • Вы хотите проверить, как скалярные поля существующей схемы отобразятся на типы protobuf, прежде чем писать message вручную.

Как пользоваться

  1. Вставьте JSON Schema с "type": "object" в корне. Имя message берётся из "title" в PascalCase (или из ключа "name"); если нет ни того, ни другого, используется Root.
  2. Конвертация выполняется в браузере; настроек нет.
  3. Скопируйте текст proto2 из панели Protobuf и проверьте типы, прежде чем использовать его в файле .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 (int64 при format int64 или границах за пределами 32-битного диапазона), number — в double (float при format float), boolean — в bool. Типы элементов массивов отображаются так же.

Строковые enum становятся вложенным enum со значениями UPPER_SNAKE с префиксом, схемы additionalProperties — map<string, T>, а локальный $ref на definitions или $defs указывает на message верхнего уровня.

Массивы массивов, oneOf/anyOf с несколькими ветвями, отличными от null, и свойства без типа сводятся к string. $ref на другой файл выдаётся как ошибка.

FAQ

Генерируется ли proto3?

Нет. Результат всегда начинается с syntax = "proto2" и использует метки required/optional.

Как выбирается имя message?

Из корневого "title", преобразованного в PascalCase, так что "Example Schema" становится ExampleSchema, или из ключа "name". Без них message называется Root. Вложенные message и enum называются по своему свойству.

Как обрабатываются nullable-поля вроде ["string", "null"]?

Часть null отбрасывается, и поле получает оставшийся тип, например optional double height для ["number", "null"]. Optional-поля в proto2 и так могут отсутствовать.

Загружается ли моя схема на сервер?

Нет. Эта страница конвертирует схему в браузере и не обращается к серверному API.

Спецификации и справка