Конвертировать схему JSON в определения Protobuf — Numio
Преобразует JSON Schema типа object в определение message proto2. Поля нумеруются в порядке свойств; обязательные свойства получают "required", остальные — "optional", массивы — "repeated", а вложенные объекты становятся вложенными message с полем, которое их использует.
У вас есть JSON Schema для события, и нужен черновик message в .proto для доработки под конвейер gRPC или Kafka.
Когда пригодится
- У вас есть JSON Schema для события, и нужен черновик message в .proto для доработки под конвейер gRPC или Kafka.
- Вы хотите проверить, как скалярные поля существующей схемы отобразятся на типы protobuf, прежде чем писать message вручную.
Как пользоваться
- Вставьте JSON Schema с "type": "object" в корне. Имя message берётся из "title" в PascalCase (или из ключа "name"); если нет ни того, ни другого, используется Root.
- Конвертация выполняется в браузере; настроек нет.
- Скопируйте текст 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.