Saltar al contenido

Convertir JSON Schema a Protobuf — Numio

Convierte un JSON Schema de tipo object en una definición de mensaje proto2. Los campos se numeran en el orden de las propiedades; las propiedades requeridas pasan a "required", las demás a "optional", los arrays a "repeated", y los objetos anidados pasan a mensajes anidados con un campo que los usa.

Tienes un JSON Schema de un evento y quieres un primer borrador de mensaje .proto para editarlo en un pipeline de gRPC o Kafka.

JSON Schema

Protobuf

Cuándo usarla

  • Tienes un JSON Schema de un evento y quieres un primer borrador de mensaje .proto para editarlo en un pipeline de gRPC o Kafka.
  • Quieres ver cómo se asignarían los campos escalares de un esquema existente a tipos de protobuf antes de escribir el mensaje tú mismo.

Cómo usarla

  1. Pega un JSON Schema con "type": "object" en la raíz. El nombre del mensaje sale de "title" en PascalCase (o de una clave "name"); sin ninguno de los dos es Root.
  2. La conversión se ejecuta en tu navegador; no hay opciones de configuración.
  3. Copia el texto proto2 del panel Protobuf y revisa los tipos antes de usarlo en un archivo .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;
}

Detalles y limitaciones

La conversión se ejecuta en tu navegador con el conversor propio del sitio; el esquema no se envía a ningún servidor.

integer se asigna a int32 (int64 con format int64 o con límites fuera del rango de 32 bits), number a double (float con format float) y boolean a bool. Los tipos de los elementos de un array se asignan igual.

Los enums de strings pasan a un enum anidado con valores UPPER_SNAKE con prefijo, los esquemas de additionalProperties pasan a map<string, T>, y un $ref local a definitions o $defs apunta a un mensaje de nivel superior.

Los arrays de arrays, oneOf/anyOf con varias ramas no nulas y las propiedades sin tipo recurren a string. Un $ref a otro archivo se notifica como error.

FAQ

¿Genera proto3?

No. La salida siempre empieza por syntax = "proto2" y usa las etiquetas required/optional.

¿Cómo se elige el nombre del mensaje?

A partir del "title" de la raíz convertido a PascalCase, de modo que "Example Schema" pasa a ExampleSchema, o de una clave "name". Sin ninguno de los dos, el mensaje se llama Root. Los mensajes y enums anidados toman el nombre de su propiedad.

¿Cómo se tratan los campos anulables como ["string", "null"]?

Se descarta la parte null y el campo usa el tipo restante, por ejemplo optional double height para ["number", "null"]. Los campos optional de proto2 ya pueden estar ausentes.

¿Se sube mi esquema?

No. Esta página convierte el esquema en el navegador y no llama a ninguna API del servidor.

Especificaciones y referencias