Converter JSON Schema em definições Protobuf — Numio
Transforma um JSON Schema do tipo object em uma definição de mensagem proto2. Os campos são numerados na ordem das propriedades; propriedades obrigatórias viram "required", as demais "optional", arrays "repeated", e objetos aninhados viram mensagens aninhadas com um campo que as usa.
Você tem um JSON Schema de um evento e quer um primeiro rascunho de mensagem .proto para editar em um pipeline de gRPC ou Kafka.
Quando usar
- Você tem um JSON Schema de um evento e quer um primeiro rascunho de mensagem .proto para editar em um pipeline de gRPC ou Kafka.
- Você quer ver como os campos escalares de um schema existente seriam mapeados para tipos de protobuf antes de escrever a mensagem você mesmo.
Como usar
- Cole um JSON Schema com "type": "object" na raiz. O nome da mensagem vem de "title" em PascalCase (ou de uma chave "name"); sem nenhum dos dois, é Root.
- A conversão roda no seu navegador; não há configurações.
- Copie o texto proto2 do painel Protobuf e revise os tipos antes de usá-lo em um arquivo .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;
}Detalhes e limitações
A conversão roda no seu navegador com o conversor próprio do site; o schema não é enviado a nenhum servidor.
integer é mapeado para int32 (int64 com format int64 ou limites fora da faixa de 32 bits), number para double (float com format float) e boolean para bool. Os tipos dos itens de arrays são mapeados da mesma forma.
Enums de strings viram um enum aninhado com valores UPPER_SNAKE prefixados, schemas de additionalProperties viram map<string, T>, e um $ref local para definitions ou $defs aponta para uma mensagem de nível superior.
Arrays de arrays, oneOf/anyOf com vários ramos não nulos e propriedades sem tipo caem para string. Um $ref para outro arquivo é reportado como erro.
FAQ
Ele gera proto3?
Não. A saída sempre começa com syntax = "proto2" e usa os rótulos required/optional.
Como o nome da mensagem é escolhido?
A partir do "title" da raiz convertido para PascalCase, então "Example Schema" vira ExampleSchema, ou de uma chave "name". Sem nenhum dos dois, a mensagem se chama Root. Mensagens e enums aninhados recebem o nome da sua propriedade.
Como são tratados campos anuláveis como ["string", "null"]?
A parte null é descartada e o campo usa o tipo restante, por exemplo optional double height para ["number", "null"]. Campos optional do proto2 já podem estar ausentes.
Meu schema é enviado?
Não. Esta página converte o schema no navegador e não chama nenhuma API do servidor.