Zum Inhalt springen

JSON zu Schema und Typen

Fügen Sie ein realistisches Beispiel der Daten hinter einem Dokument ein. Sie erhalten das JSON Schema, das daraus folgt — dasselbe, das der Editor für die Autovervollständigung nutzt — und die TypeScript- und Python-Dateien, die formfeed types daraus schreiben würde.

Die Daten verlassen diesen Tab nicht: Schema und Typen entstehen in Ihrem Browser.

Ihre Daten

Dieses Tool braucht JavaScript: Das Schema entsteht in Ihrem Browser, nicht auf einem Server.

Benennt die erzeugten Typen: invoice ergibt InvoiceData.

Das JSON, das Sie als data senden würden. Ein realistisches Beispiel genügt.

Was daraus wird

Fügen Sie das JSON ein, das Sie an ein Rendering senden — Schema und Typen erscheinen hier.

Wofür ein Schema hier gut ist

Eine Vorlage besteht aus HTML und den Feldern Ihrer Daten, und jeder Teil von Formfeed, der beim Schreiben hilft, muss diese Felder kennen. Der Editor liest das Schema für die Autovervollständigung und markiert eine Variable, die Ihre Daten nicht haben; formfeed types macht daraus eine Deklarationsdatei, sodass der Compiler die Daten, die Ihr eigener Code sendet, gegen die Felder der Vorlage prüft.

Schreiben müssen Sie so ein Schema nie. Eine Vorlage hält Beispieldaten, und daraus wird es abgeleitet — genau das tut diese Seite, mit derselben Funktion, die der Editor aufruft.

Warum alle Felder optional herauskommen

Ein Beispiel sagt, wie ein Feld aussieht, wenn es da ist. Es sagt nicht, ob es immer da ist: Eine Rechnung ohne Rabattzeile ist keine Rechnung mit einer kaputten. Die Typen aus einem abgeleiteten Schema machen deshalb jedes Feld optional, die von formfeed types ebenso wie diese hier.

Schreiben Sie die Felder, auf die Sie sich wirklich verlassen, in eine schema.json neben die Vorlage, dann nimmt die CLI diese und überträgt sie mit der Vorlage. Eine fehlende Summe ist dann ein Compile-Fehler statt einer leeren Zeile im PDF, eine Anfrage mit validate_data wird abgewiesen, bevor etwas gerendert wird, und eine Version, die Ihre bestehenden Aufrufer brechen würde, lässt sich nur mit allow_breaking veröffentlichen.

Aus demselben Grund steht im Schema oben nichts unter required. Es als schema.json zu speichern macht aus einer Vermutung einen Vertrag — entscheiden Sie also selbst, was dort hineingehört, statt es ein einzelnes Beispiel entscheiden zu lassen.

Dasselbe im Projekt

Sobald die Vorlagen Dateien in Ihrem Repository sind, macht die CLI das ohne Einfügen. Sie liest jeden Vorlagenordner, bevorzugt eine schema.json und leitet sonst über alle Datensätze des Ordners ab — ein Feld, das nur manche Sätze führen, ist dann bewusst optional:

Shell
# in a template project: reads schema.json, else infers over data/*.json
formfeed types --lang ts

# then the SDK checks the data against the template
# renders.create({ template: 'invoice', data: { … } })
Shell
formfeed types --lang python

# then one method per template
# typed(client).invoice({ … })

Mit --remote liest sie stattdessen die veröffentlichte Version über die API (bei einer nie veröffentlichten Vorlage den Entwurf), deren gespeichertes Schema oder eines, das aus ihren Datensätzen abgeleitet wird, damit die Typen zu dem passen, was die API wirklich rendert.

Fragen

Verlassen meine Daten den Browser?
Nein. Ableitung und Ausgabe laufen auf dieser Seite; nichts wird hochgeladen, nichts gespeichert. Sie können echte Daten einfügen und den Tab schließen.
Ist das dieselbe Ausgabe wie in der CLI?
Ja, Byte für Byte, für eine Vorlage desselben Namens, deren einziger Datensatz das Eingefügte ist: Die Seite ruft inferSchema aus der Engine und generateTypes aus dem Development Kit auf — dieselben Funktionen wie formfeed types. Sie liegen genau deshalb in diesen Paketen, damit keine zweite Kopie davon abweichen kann.
Kann ich das ohne Formfeed nutzen?
Das JSON Schema ja — es ist ein gewöhnliches Schema nach Draft 2020-12. Die TypeScript-Datei deklariert eine Modul-Erweiterung für @formfeed/sdk, die Python-Datei baut auf dem Formfeed-Client auf; diese beiden ergeben also nur mit den SDKs Sinn.
Was ist mit Datum, Aufzählungen und Beträgen?
Ein Datum ist für JSON ein String und wird als solcher typisiert; formatieren Sie den Wert in der Vorlage mit date, nicht in Ihrem Code. Werte, die nach einer festen Menge aussehen, kommen als ihr Typ heraus, nicht als Union: Ein Beispiel kann einen Status aus drei Zuständen nicht von einem Freitextfeld unterscheiden.

Heute mit dem Rendern beginnen

Der kostenlose Plan enthält 100 Einheiten im Monat und kostenlose Testrenderings. Wechseln Sie den Plan, wenn Sie mehr brauchen.