Aller au contenu

JSON vers structures Rust

JSON to Rust Structs

Produit des structures Rust annotées pour serde à partir d’un échantillon, avec Option pour les champs absents ou nuls et un renommage en snake_case.

Émet des structs Rust avec les derives `serde` à partir d'un document JSON d'exemple — `Serialize`, `Deserialize`, le bon `Option<…>` sur les champs parfois absents, et un `#[serde(rename = "…")]` partout où la clé JSON n'est pas un nom de champ snake_case légal.

🔒 Fonctionne entièrement dans votre navigateurrustjsoncodegenserde
Produire

JSON d’exemple

Déposez un fichier .json

Lu dans cet onglet. Rien n’est envoyé.

Donnez-lui tous les éléments dont vous disposez. Chaque enregistrement supplémentaire resserre la déduction : un champ absent de l’un d’eux est précisément ce qui le rend facultatif.

Rust

Comment s’en servir

  1. Collez autant d'enregistrements que vous en avez

    Chaque élément de chaque tableau est lu et fusionné, pas seulement le premier. Trois enregistrements en disent bien plus qu'un seul, car un champ absent de l'un d'eux est précisément ce qui rend ce champ facultatif.

  2. Nommez le type racine

    Les objets imbriqués sont nommés d'après la clé qui les porte, mise au singulier pour les tableaux : `users` donne donc un `User`. Seule la racine attend un nom de votre part.

  3. Lisez les décomptes sous la sortie

    Types, champs facultatifs, unions et nombre d'enregistrements fusionnés. Un décompte d'unions supérieur à zéro signifie qu'un champ portait deux sortes de valeurs différentes dans votre échantillon — cela vaut la peine d'y regarder avant de coller le résultat dans une base de code.

  4. Collez les structs dans votre crate

    La ligne `use serde::{Deserialize, Serialize};` est émise pour vous ; la crate elle-même et sa feature `derive`, c'est à vous de les ajouter au Cargo.toml.

Questions fréquentes

Pourquoi un champ est-il ressorti en `serde_json::Value` ?

Parce qu'il portait plus d'une sorte de valeur dans l'échantillon — une chaîne dans un enregistrement, un nombre dans un autre. Rust n'a pas d'union non étiquetée sur laquelle se rabattre ici, et `Value` est le type honnête : il désérialise sans mentir sur ce qu'il contient.

Quelle est la différence entre `Option<T>` et `#[serde(default)]` ici ?

Un champ qui valait `null` dans certains enregistrements devient `Option<T>` ; un champ simplement absent reçoit en plus `#[serde(default)]`, si bien que désérialiser un enregistrement qui en est dépourvu réussit au lieu d'échouer. Les deux apparaissent ensemble quand l'échantillon a montré les deux.

Des enums sont-elles générées pour les champs chaîne ?

Non. Toute chaîne est un `String`. Inférer une enum à partir d'une poignée d'enregistrements, c'est une erreur de désérialisation dès que la production envoie une variante que votre échantillon ne contenait pas — une panne pire qu'un type trop large.

Puis-je dériver d'autres traits ?

Ajoutez-les vous-même — la liste de derives émise se limite délibérément à `Serialize, Deserialize`. `Debug` et `Clone` sont presque toujours souhaités aussi, mais c'est une modification d'une ligne, et se tromper empêcherait la sortie de compiler pour les types qui ne peuvent pas les dériver.

À alimenter depuis

Ensuite

Ces outils acceptent ce que celui-ci produit : le résultat peut y aller directement.