100 % lokal — Ihre Daten verlassen nie Ihren Browser

JSON in io-ts — decodieren und Typ bekommen

Ein JSON-Beispiel in io-ts-Codecs verwandeln. Ein Codec je Objekt, vor der Verwendung deklariert, und TypeOf gibt Ihnen den statischen Typ dazu.

Sofort Privat Null Cookies

JSON-Eingabe

io-ts-Ausgabe

Was dieses Werkzeug tut

Aus einer JSON-Probe werden io-ts-Codecs, ein const je Objekt.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import * as t from "io-ts";

export const Address = t.type({
  city: t.string,
});

export const Root = t.type({
  id: t.Int,
  name: t.string,
  address: Address,
});

Die Kinder werden zuerst deklariert: Codecs sind Laufzeitwerte, einer muss da sein, bevor ein anderer ihn nennt. Ein Array an der Wurzel bekommt seinen eigenen Codec — export const Users = t.array(UsersItem); — statt ihn Ihnen zu überlassen.

t.Int ist markiert, und das merkt man

t.Int ist eine Verfeinerung von t.number mit dem Nachweis der Ganzzahligkeit. t.TypeOf<typeof Root> ergibt daher { id: Int; … }, nicht { id: number; … }. Ein Int passt überall dorthin, wo ein number erwartet wird; umgekehrt braucht es ein decode. Ist Ihnen diese Reibung die Ganzzahlprüfung nicht wert, ist t.number ein Ersatz von einem Wort.

Welchen der beiden Sie bekommen, hängt an der Schreibweise: 3 ergibt t.Int, 10.0 ergibt t.number. Bis vor kurzem ergab auch 10.0 ein t.Int, und der Codec wies dann 10.5 ab — den nächsten Datensatz. Ein echter Fehler, beim Schreiben dieser Seiten gefunden und behoben.

Was ein Codec durchlässt

t.type prüft, was es kennt, und übergeht den Rest. Eine Antwort mit drei zusätzlichen Feldern dekodiert sauber. Das ist die Interface-Semantik von io-ts und die richtige Vorgabe, um fremde APIs zu lesen — soll ein unerwarteter Schlüssel ein Fehler sein, hüllen Sie dieselbe Form in t.strict, oder in t.exact, um ihn zu entfernen.

Dekodieren, in einer Zeile

import { isRight } from "fp-ts/Either";

const result = Root.decode(payload);
if (isRight(result)) { /* result.right ist typisiert */ }

PathReporter.report(result) macht aus einem Fehlschlag lesbare Pfade — nützlich beim ersten Mal, wenn ein Codec eine Nutzlast ablehnt, die Sie für richtig hielten.

Alles ist Pflicht

Jeder Schlüssel der Probe landet in t.type, also als Pflichtfeld. io-ts schreibt Optionalität in ein eigenes t.partial, verbunden per t.intersection. Die Schlüssel auf beide Hälften zu verteilen ist eine Aussage über die API; ein Dokument kann sie nicht für Sie treffen.

Datenschutz ab Werk

Alles läuft lokal in deinem Browser mit JavaScript. Deine Daten werden nie hochgeladen, wodurch das Tool auch für sensible Inhalte sicher ist und offline funktioniert.

Häufige Fragen

Lehnt `t.type` überzählige Eigenschaften ab?
Nein. `t.type` prüft die Eigenschaften, die es kennt, und lässt den Rest durch — das nennt io-ts einen Interface-Codec. `t.exact` entfernt die Überzähligen, `t.strict` weist sie ab. Der Generator gibt `t.type` aus, weil eine Probe nicht sagen kann, welchen der drei Sie wollen: eine Entscheidung über Ihre API.
Warum liefert `t.TypeOf` mir `Int` statt `number`?
`t.Int` ist ein markierter Typ: ein `Int` ist ein `number` mit dem Nachweis, als Ganzzahl geprüft worden zu sein. Ein `Int` einem `number` zuzuweisen geht; umgekehrt braucht es ein decode. Wollen Sie überall schlichte Zahlen, ersetzen Sie `t.Int` durch `t.number` und verzichten auf die Ganzzahlprüfung.
Ist jedes Feld Pflicht?
Ja, und mehr trägt eine Probe nicht. io-ts schreibt Optionalität mit `t.partial`, meist als `t.intersection([t.type({…}), t.partial({…})])`. Die Schlüssel auf beide Hälften zu verteilen setzt Kenntnis der API voraus, nicht das Lesen eines Dokuments — die Intersection bleibt Ihnen überlassen.

Ähnliche Konverter