Pular para o conteúdo

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.

JSON Schema

Protobuf

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

  1. 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.
  2. A conversão roda no seu navegador; não há configurações.
  3. 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.

Especificações e referências