Vai al contenuto

Da JSON a struct Rust

JSON to Rust Structs

Genera struct Rust annotate con serde da un esempio JSON, con Option per i campi nulli o assenti e la rinomina in snake_case.

Emette struct Rust con le derive di `serde` a partire da un documento JSON di esempio: `Serialize`, `Deserialize`, l’`Option<…>` giusto sui campi che a volte erano assenti, e un `#[serde(rename = "…")]` ovunque la chiave JSON non sia un nome di campo snake_case legale.

🔒 Funziona interamente nel tuo browserrustjsoncodegenserde
Produci

JSON di esempio

Trascina un file .json

Letto in questa scheda. Non viene caricato niente.

Dagli tutti gli elementi che hai. Ogni record in più restringe la deduzione: un campo che manca in uno di loro è proprio quello che lo rende facoltativo.

Rust

Come si usa

  1. Incollare tutti i record che si hanno

    Viene letto e fuso ogni elemento di ogni array, non solo il primo. Tre record dicono molto più di uno, perché un campo che manca in uno di essi è esattamente ciò che rende quel campo facoltativo.

  2. Dare un nome al tipo radice

    Gli oggetti annidati prendono il nome dalla chiave che li contiene, al singolare per gli array, così `users` produce un `User`. Solo la radice ha bisogno di un nome dato a mano.

  3. Leggere i conteggi sotto l’uscita

    Tipi, campi facoltativi, unioni e quanti record sono stati fusi. Un conteggio di unioni sopra lo zero vuol dire che nel campione un campo ha contenuto due generi di valore diversi — vale la pena guardarlo prima di incollare il risultato in una base di codice.

  4. Incollare le struct nel proprio crate

    La riga `use serde::{Deserialize, Serialize};` viene emessa automaticamente; il crate in sé e la sua feature `derive` restano da aggiungere al Cargo.toml.

Domande frequenti

Perché un campo è uscito come `serde_json::Value`?

Perché nel campione ha contenuto più di un genere di valore: una stringa in un record e un numero in un altro. Qui Rust non ha un’unione senza tag su cui ripiegare, e `Value` è il tipo onesto: deserializza senza mentire su che cosa c’è dentro.

Qual è qui la differenza fra `Option<T>` e `#[serde(default)]`?

Un campo che in alcuni record era `null` diventa `Option<T>`; un campo che era semplicemente assente riceve anche `#[serde(default)]`, così deserializzare un record che ne è privo riesce invece di dare errore. Compaiono insieme quando il campione ha mostrato entrambe le cose.

Vengono generati enum per i campi stringa?

No. Ogni stringa è `String`. Dedurre un enum da una manciata di record vuol dire un errore di deserializzazione la prima volta che la produzione manda una variante che il campione non conteneva, il che è un guasto peggiore di un tipo largo.

Si possono derivare altri trait?

Vanno aggiunti a mano: l’elenco di derive emesso è di proposito soltanto `Serialize, Deserialize`. Anche `Debug` e `Clone` si vogliono quasi sempre, ma sono una modifica da una riga, e indovinare male fa sì che l’uscita non compili per i tipi che non possono derivarli.

Può ricevere da

Dopo

Questi accettano ciò che produce questo strumento, così il risultato può passare direttamente.