PK Systems PK Systems
Entwickler-Tools

JSON-Schema-Generator

Erzeugen Sie aus einer JSON-Probe automatisch ein JSON-Schema (Draft-07). Mit anpassbaren Optionen für Strenge, required-Felder und Beispiele.

JSON-Schema-Generator

Ausgabe

Das Schema erscheint hier während du tippst.

Was ist JSON Schema?

JSON Schema ist ein Vokabular zur Beschreibung von JSON. Es sagt: „Dieses Objekt muss diese Schlüssel haben, mit diesen Typen und Werten, die zu diesen Mustern passen“ – und Validatoren (Ajv, jsonschema, opis/json-schema, jedes OpenAPI-Tool) erzwingen diesen Vertrag. Aktueller Standard ist Draft 2020-12, den auch OpenAPI 3.1 nutzt; Draft 7 ist die Vorgängerversion und in älteren Toolchains noch verbreitet. Die beiden unterscheiden sich nur in kleinen syntaktischen Details – dieser Generator gibt beide aus.

So funktioniert es

Füge ein JSON-Beispiel ein. Die Ausgabe liefert ein passendes Schema, in dem jedes Blatt als string, integer, number, boolean, null typisiert wird, plus object / array für Container. Mit aktivem Formate erkennen bekommen Strings, die gängigen Mustern entsprechen, einen format-Hinweis – email, uri, date, date-time, uuid, ipv4. Mit aktivem Required markieren wird jeder im Beispiel vorhandene Schlüssel zu required hinzugefügt – wirf ein Array mehrerer Objekte hinein, um eine ehrliche Required-Liste zu erhalten (nur Schlüssel, die in allen Objekten vorkommen, überleben). Optionale Felder Title und $id werden oben am Schema ergänzt.

Erkannte Formate

  • email – alles, was zum einfachen Muster local@host.tld passt.
  • uri – Strings, die mit http:// oder https:// beginnen.
  • dateYYYY-MM-DD (RFC 3339 full-date).
  • date-timeYYYY-MM-DDTHH:MM:SS[.fff][Z|+HH:MM] (RFC 3339).
  • timeHH:MM:SS[.fff][Z|+HH:MM].
  • uuid – RFC-4122-UUIDs v1–v5.
  • ipv4 – IPv4-Adressen in Punkt-Dezimal-Notation.
Andere Formate aus der Spezifikation (uri-reference, idn-email, regex, json-pointer) werden nicht automatisch erkannt; bei Bedarf manuell ergänzen.

Häufig gestellte Fragen

Sollte ich einem inferierten Schema in Produktion vertrauen?
Behandle es als Ausgangspunkt. Der Inferer sieht nur, was im Beispiel steht – ist ein Feld in jedem Beispiel zufällig eine positive Ganzzahl, soll laut Doku aber auch Null oder Negative erlauben, ist das inferierte Schema zu streng. Genauso können Felder, die in 100 % deiner Beispiele auftauchen, in Wirklichkeit optional sein. Vergleiche das Schema vor dem Push immer mit dem dokumentierten Vertrag deiner API.
Wie wählt das Tool die Required-Felder?
Bei einem einzelnen Objekt wird jeder Schlüssel als required markiert (weil jeder Schlüssel vorhanden ist). Bei einem Array von Objekten werden nur Schlüssel als required markiert, die in jedem Objekt vorkommen – Schlüssel, die nur in einigen vorkommen, werden optional. Genau so lesen Validatoren das Schema: „Dieses Feld muss immer vorhanden sein.“
Worin unterscheiden sich Draft 2020-12 und Draft 7?
Bei 95 % aller Schemata in nichts – das Grundvokabular ist identisch. Unterschiede zeigen sich bei fortgeschrittenen Features: $dynamicRef ersetzt $recursiveRef, items ersetzt additionalItems für Tuple-Validierung, und einige Keywords sind zwischen Vokabularen umgezogen. Wenn du mit OpenAPI 3.1 oder Ajv 8+ integrierst, nimm 2020-12; für ältere Ajv-Versionen (v6), älteres Stoplight oder alles vor 2019 nimm Draft 7.
Warum wird mein Datum als date-time und nicht als date erkannt?
Die Reihenfolge der Erkennung ist date-time vor date, deshalb matcht 2024-01-15T00:00:00Z zuerst auf date-time. 2024-01-15 allein matcht auf date. Willst du ein reines Datumsfeld, bearbeite das Schema von Hand oder entferne den Zeitanteil aus dem Beispiel.
Erkennt das Schema enum-artige Felder?
Nein – „dies muss eines aus [active, paused, archived] sein“ zu inferieren, braucht mehr Beispiele als ein typisches Paste enthält, und Fehlinferenzen sind gefährlich (ein einzelner Mandant, der in einen neuen Status wechselt, würde die Validierung in Produktion brechen). Ergänze enum: [...] manuell, sobald du deine Domäne geprüft hast.
Kann ich die Ausgabe mit OpenAPI verwenden?
Ja – kopiere den Schema-Body (alles außer $schema und $id) in einen components.schemas.MyType-Eintrag. OpenAPI 3.1 unterstützt das volle Draft-2020-12-Vokabular; OpenAPI 3.0 unterstützt eine Teilmenge nahe an Draft 7 – mit ein paar Eigenheiten (kein nullable-Keyword in Draft 7; OpenAPI 3.0 hat sein eigenes ergänzt).