Vai al contenuto

JSON Schema per le definizioni di Protobuf — Numio

Trasforma un JSON Schema di tipo object in una definizione di messaggio proto2. I campi sono numerati nell’ordine delle proprietà: le proprietà obbligatorie diventano "required", le altre "optional", gli array "repeated" e gli oggetti annidati diventano messaggi annidati con un campo che li usa.

Hai uno schema JSON per un evento e desideri una prima bozza di un messaggio .proto da modificare per una pipeline gRPC o Kafka.

JSON Schema

Protobuf

Quando usarlo

  • Hai uno schema JSON per un evento e desideri una prima bozza di un messaggio .proto da modificare per una pipeline gRPC o Kafka.
  • Si desidera verificare in che modo i campi scalari di uno schema esistente verranno mappati ai tipi protobuf prima di scrivere personalmente il messaggio.

Come si usa

  1. Incolla un JSON Schema con "type": "object" alla radice. Il nome del messaggio deriva da "title" in PascalCase (oppure da una chiave "name"); in assenza di entrambi, è Root.
  2. La conversione viene eseguita nel tuo browser; non ci sono impostazioni.
  3. Copia il testo proto2 dal pannello Protobuf e rivedi i tipi prima di utilizzarlo in un file .proto.

Schema JSON

{
  "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"]
}

Buffer di protocollo (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;
}

Dettagli e limiti

La conversione viene eseguita nel tuo browser con il convertitore del sito; lo schema non viene inviato a un server.

l'intero viene mappato su int32 (int64 con formato int64 o limiti esterni all'intervallo di 32 bit), il numero su double (float con formato float) e il booleano su bool. I tipi di elementi dell'array vengono mappati allo stesso modo.

Le enumerazioni di stringhe diventano un'enumerazione nidificata con valori UPPER_SNAKE prefissati, gli schemi additionalProperties diventano map<string, T> e $ref locale alle definizioni o $defs punta a un messaggio di livello superiore.

Array di array, oneOf/anyOf con diversi rami non nulli e proprietà non tipizzate ricadono in string. Un $ref in un altro file viene segnalato come errore.

FAQ

Genera proto3?

No. L’output inizia sempre con syntax = "proto2" e usa le etichette required/optional.

Come viene scelto il nome del messaggio?

Dal campo "title" della radice convertito in PascalCase, quindi "Example Schema" diventa ExampleSchema, oppure da una chiave "name". Se mancano entrambi, il messaggio si chiama Root. I messaggi e gli enum annidati prendono il nome dalla relativa proprietà.

Come vengono gestiti i campi nullable come ["string", "null"]?

La parte null viene scartata e il campo usa il tipo restante, ad esempio optional double height per ["number", "null"]. I campi optional di proto2 possono già essere assenti.

Il mio schema è stato caricato?

No. Questa pagina converte lo schema nel browser e non chiama un server API.

Specifiche e riferimenti