Convertir JSON Schema en définitions Protobuf — Numio
Transforme un JSON Schema de type object en définition de message proto2. Les champs sont numérotés dans l’ordre des propriétés ; les propriétés requises deviennent "required", les autres "optional", les tableaux "repeated", et les objets imbriqués deviennent des messages imbriqués avec un champ qui les utilise.
Vous avez un JSON Schema pour un événement et voulez un premier jet de message .proto à retravailler pour un pipeline gRPC ou Kafka.
Quand l’utiliser
- Vous avez un JSON Schema pour un événement et voulez un premier jet de message .proto à retravailler pour un pipeline gRPC ou Kafka.
- Vous voulez voir comment les champs scalaires d’un schéma existant seraient mappés vers les types protobuf avant d’écrire le message vous-même.
Mode d’emploi
- Collez un JSON Schema avec "type": "object" à la racine. Le nom du message provient de "title" en PascalCase (ou d’une clé "name") ; sans l’un ni l’autre, il s’appelle Root.
- La conversion s’exécute dans votre navigateur ; il n’y a aucun paramètre.
- Copiez le texte proto2 du panneau Protobuf et vérifiez les types avant de l’utiliser dans un fichier .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;
}Détails et limites
La conversion s’exécute dans votre navigateur avec le convertisseur propre au site ; le schéma n’est envoyé à aucun serveur.
integer est mappé vers int32 (int64 avec format int64 ou des bornes hors de la plage 32 bits), number vers double (float avec format float) et boolean vers bool. Les types des éléments de tableau sont mappés de la même façon.
Les enums de chaînes deviennent un enum imbriqué avec des valeurs UPPER_SNAKE préfixées, les schémas additionalProperties deviennent map<string, T>, et un $ref local vers definitions ou $defs pointe vers un message de premier niveau.
Les tableaux de tableaux, les oneOf/anyOf avec plusieurs branches non nulles et les propriétés sans type se rabattent sur string. Un $ref vers un autre fichier est signalé comme une erreur.
FAQ
Génère-t-il du proto3 ?
Non. La sortie commence toujours par syntax = "proto2" et utilise les étiquettes required/optional.
Comment le nom du message est-il choisi ?
À partir du "title" de la racine converti en PascalCase, si bien que "Example Schema" devient ExampleSchema, ou d’une clé "name". Sans l’un ni l’autre, le message s’appelle Root. Les messages et enums imbriqués prennent le nom de leur propriété.
Comment les champs nullables comme ["string", "null"] sont-ils traités ?
La partie null est ignorée et le champ utilise le type restant, par exemple optional double height pour ["number", "null"]. Les champs optional de proto2 peuvent déjà être absents.
Mon schéma est-il envoyé en ligne ?
Non. Cette page convertit le schéma dans le navigateur et n’appelle aucune API serveur.