Zum Inhalt springen

JSON Schema in Protobuf umwandeln — Numio

Wandelt ein JSON Schema vom Typ object in eine proto2-Message-Definition um. Felder werden in der Reihenfolge der Properties nummeriert; Pflicht-Properties werden zu "required", andere zu "optional", Arrays zu "repeated", und verschachtelte Objekte werden zu verschachtelten Messages mit einem Feld, das sie verwendet.

Du hast ein JSON Schema für ein Event und willst einen ersten Entwurf einer .proto-Message, den du für eine gRPC- oder Kafka-Pipeline bearbeitest.

JSON Schema

Protobuf

Wann sie hilft

  • Du hast ein JSON Schema für ein Event und willst einen ersten Entwurf einer .proto-Message, den du für eine gRPC- oder Kafka-Pipeline bearbeitest.
  • Du willst prüfen, wie die skalaren Felder eines vorhandenen Schemas auf Protobuf-Typen abgebildet würden, bevor du die Message selbst schreibst.

Anwendung

  1. Füge ein JSON Schema mit "type": "object" auf der obersten Ebene ein. Der Message-Name stammt aus "title" in PascalCase (oder aus einem "name"-Schlüssel); ohne beides lautet er Root.
  2. Die Konvertierung läuft in deinem Browser; es gibt keine Einstellungen.
  3. Kopiere den proto2-Text aus dem Panel Protobuf und prüfe die Typen, bevor du ihn in einer .proto-Datei verwendest.

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;
}

Details und Einschränkungen

Die Konvertierung läuft in deinem Browser mit dem eigenen Konverter der Website; das Schema wird nicht an einen Server gesendet.

integer wird zu int32 (int64 bei format int64 oder Grenzen außerhalb des 32-Bit-Bereichs), number zu double (float bei format float) und boolean zu bool. Elementtypen von Arrays werden genauso abgebildet.

String-enums werden zu einem verschachtelten enum mit präfixierten UPPER_SNAKE-Werten, additionalProperties-Schemas zu map<string, T>, und ein lokaler $ref auf definitions oder $defs verweist auf eine Message auf oberster Ebene.

Arrays von Arrays, oneOf/anyOf mit mehreren Nicht-null-Zweigen und Properties ohne Typ fallen auf string zurück. Ein $ref auf eine andere Datei wird als Fehler gemeldet.

FAQ

Wird proto3 erzeugt?

Nein. Die Ausgabe beginnt immer mit syntax = "proto2" und verwendet die Labels required/optional.

Wie wird der Message-Name gewählt?

Aus dem "title" der Wurzel, umgewandelt in PascalCase, sodass "Example Schema" zu ExampleSchema wird, oder aus einem "name"-Schlüssel. Ohne beides heißt die Message Root. Verschachtelte Messages und enums werden nach ihrer Property benannt.

Wie werden nullable Felder wie ["string", "null"] behandelt?

Der null-Teil wird verworfen, und das Feld verwendet den verbleibenden Typ, zum Beispiel optional double height für ["number", "null"]. Optionale Felder in proto2 können ohnehin fehlen.

Wird mein Schema hochgeladen?

Nein. Diese Seite konvertiert das Schema im Browser und ruft keine Server-API auf.

Spezifikationen und Referenzen