Zum Inhalt springen

JSON in Rust-Structs

JSON to Rust Structs

Erzeugt aus einem JSON-Beispiel serde-annotierte Rust-Structs, mit Option für nullbare oder fehlende Felder und snake_case-Umbenennungen.

Gibt aus einem JSON-Beispieldokument Rust-Structs mit `serde`-Derives aus – `Serialize`, `Deserialize`, das passende `Option<…>` an Feldern, die manchmal fehlten, und ein `#[serde(rename = "…")]` überall dort, wo der JSON-Schlüssel kein zulässiger snake_case-Feldname ist.

🔒 Läuft vollständig in Ihrem Browserrustjsoncodegenserde
Ausgeben als

Beispiel-JSON

Eine .json-Datei ablegen

Wird in diesem Tab gelesen. Nichts wird hochgeladen.

Geben Sie ihm jedes Element, das Sie haben. Jeder weitere Datensatz engt die Vermutung ein – ein Feld, das in einem davon fehlt, ist genau das, was es optional macht.

Rust

So funktioniert es

  1. Fügen Sie so viele Datensätze ein, wie Sie haben

    Jedes Element jedes Arrays wird gelesen und zusammengeführt, nicht nur das erste. Drei Datensätze sagen weit mehr als einer, denn ein Feld, das in einem davon fehlt, ist genau das, was dieses Feld optional macht.

  2. Benennen Sie den Wurzeltyp

    Verschachtelte Objekte werden nach dem Schlüssel benannt, der sie enthält, bei Arrays in die Einzahl gesetzt, sodass `users` ein `User` ergibt. Nur die Wurzel braucht einen Namen von Ihnen.

  3. Lesen Sie die Zähler unter der Ausgabe

    Typen, optionale Felder, Unions und wie viele Datensätze zusammengeführt wurden. Ein Union-Zähler über null bedeutet, dass ein Feld in Ihrer Stichprobe zwei verschiedene Arten von Wert hatte – einen Blick wert, bevor Sie das Ergebnis in eine Codebasis einfügen.

  4. Fügen Sie die Structs in Ihre Crate ein

    Die Zeile `use serde::{Deserialize, Serialize};` wird für Sie ausgegeben; die Crate selbst und ihr `derive`-Feature tragen Sie in Cargo.toml ein.

Häufige Fragen

Warum kam ein Feld als `serde_json::Value` heraus?

Weil es über die Stichprobe hinweg mehr als eine Art von Wert hatte – einen String in einem Datensatz und eine Zahl in einem anderen. Rust hat hier keine untagged Union, auf die es ausweichen könnte, und `Value` ist der ehrliche Typ: Er deserialisiert, ohne über seinen Inhalt zu lügen.

Was ist hier der Unterschied zwischen `Option<T>` und `#[serde(default)]`?

Ein Feld, das in manchen Datensätzen `null` war, wird zu `Option<T>`; ein Feld, das schlicht fehlte, bekommt zusätzlich `#[serde(default)]`, damit das Deserialisieren eines Datensatzes ohne dieses Feld gelingt, statt einen Fehler zu werfen. Beides erscheint zusammen, wenn die Stichprobe beides gezeigt hat.

Werden für String-Felder Enums erzeugt?

Nein. Jeder String ist `String`. Ein Enum aus einer Handvoll Datensätze abzuleiten bedeutet einen Deserialisierungsfehler, sobald die Produktion eine Variante schickt, die Ihre Stichprobe nicht enthielt – ein schlimmerer Fehlschlag als ein lockerer Typ.

Kann ich weitere Traits ableiten?

Fügen Sie sie selbst hinzu – die ausgegebene Derive-Liste ist absichtlich nur `Serialize, Deserialize`. `Debug` und `Clone` sind fast immer ebenfalls erwünscht, aber sie sind eine einzeilige Änderung, und wer falsch rät, bekommt eine Ausgabe, die für Typen, die sie nicht ableiten können, nicht kompiliert.

Eingabe aus

Danach

Diese Tools nehmen an, was dieses hier erzeugt, das Ergebnis kann also direkt weiter.