Skip to content

Convertisseur JSON vers struct Rust

Collez du JSON, obtenez des struct serde Rust idiomatiques instantanément, 100 % dans le navigateur. Typage i64/u64/f64 correct, Option pour les null, #[serde(rename)] pour le camelCase. Gratuit.

Sans pistage Fonctionne dans le navigateur Gratuit
Options
0 car.
Sortie Rust
0 lignes
Sortie vérifiée par rapport à la sémantique de serde et au formatage rustfmt sur des charges utiles d'API réelles. — Go Tools Team · 2 juil. 2026

Qu'est-ce que la conversion JSON vers Rust ?

La conversion JSON vers Rust transforme un échantillon JSON en struct Rust prêts à compiler avec les macros #[derive(Serialize, Deserialize)] de serde, pour ne plus jamais écrire à la main le code de désérialisation des réponses d'API ou des fichiers de configuration. Ce générateur rapide de struct Rust déduit les types numériques corrects, marque les champs absents comme Option et ajoute #[serde(rename)] pour les clés non snake_case — le tout à 100 % dans votre navigateur.

Exemples

Réponse d'API

{"id":101,"name":"Ada Lovelace","email":"ada@example.com","active":true,"roles":["admin","user"]}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub id: i64,
    pub name: String,
    pub email: String,
    pub active: bool,
    pub roles: Vec<String>,
}

Une charge utile REST typique devient un struct prêt pour serde à intégrer dans votre client. Les nombres sont déduits en i64, les tableaux deviennent Vec<String>.

Objet imbriqué

{"repo":"serde","owner":{"login":"dtolnay","id":100}}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub repo: String,
    pub owner: Owner,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Owner {
    pub login: String,
    pub id: i64,
}

Les objets imbriqués deviennent des struct distincts et nommés (Owner) référencés par champ — les formes identiques sont dédupliquées.

Tableau d'objets (champ optionnel)

{"users":[{"id":1,"nick":"x"},{"id":2}]}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub users: Vec<User>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
    pub id: i64,
    pub nick: Option<String>,
}

Les tableaux d'objets fusionnent en un seul struct d'élément. Les clés absentes de certains éléments deviennent Option<String> — pas besoin de #[serde(default)].

Clés en camelCase

{"login":"octocat","publicRepos":15,"followerCount":9001,"createdAt":"2011-01-25"}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub login: String,
    #[serde(rename = "publicRepos")]
    pub public_repos: i64,
    #[serde(rename = "followerCount")]
    pub follower_count: i64,
    #[serde(rename = "createdAt")]
    pub created_at: String,
}

Les champs deviennent snake_case avec #[serde(rename)] renvoyant vers la clé JSON d'origine. Les clés déjà en snake_case comme login n'ont pas de rename.

Comment convertir du JSON en Rust

  1. 1

    Collez votre JSON

    Déposez un objet JSON, un tableau ou une réponse d'API dans le champ de saisie. La conversion démarre instantanément.

  2. 2

    Ajustez la sortie

    Renommez le struct racine et activez ou non les dérivations serde, Debug et Clone, ou la visibilité pub selon le style de votre crate.

  3. 3

    Copiez ou téléchargez

    Récupérez le Rust généré en un clic et collez-le directement dans votre projet.

Common Use Cases

Clients d'API typés
Transformez un exemple de réponse REST ou GraphQL en struct serde pour un client reqwest ou similaire, sans écrire à la main le code de désérialisation.
Analyse de configs et de fixtures
Générez des struct pour les fichiers de configuration JSON, les fixtures de test ou les charges utiles de webhooks que vous devez désérialiser avec serde_json.
Prototypage rapide
Collez une charge utile inconnue pour voir instantanément sa forme sous forme de types Rust — un moyen rapide d'explorer une nouvelle API avant de la brancher.

Comment fonctionne la conversion

Inférence structurelle
Chaque objet devient un struct nommé ; les formes identiques sont dédupliquées pour obtenir un seul struct, pas des copies. Les tableaux d'objets sont fusionnés clé par clé, et les clés absentes de certains éléments deviennent Option<T>.
Typage numérique correct
Les entiers deviennent i64, passent à u64 au-delà de i64::MAX, et basculent vers f64 au-delà de u64. Les flottants sont détectés à partir du jeton (1.0, 2e3) pour que la désérialisation serde n'échoue jamais sur un flottant placé dans un champ entier.
Identifiants idiomatiques et compilables
Les clés deviennent des champs snake_case avec #[serde(rename)] renvoyant vers la clé d'origine ; les mots-clés Rust, les noms en double et les clés non identifiantes sont assainis pour que la sortie compile toujours.
100 % côté navigateur
L'analyse et la génération s'exécutent dans votre navigateur sans aucun appel réseau, vos données restent donc privées.

Conseils pour des struct Rust propres

Nommez votre struct racine
Donnez un nom racine parlant (par exemple User, ApiResponse) au lieu du Root par défaut pour un code lisible.
N'ajoutez serde_json que si nécessaire
serde_json::Value apparaît pour les tableaux vides ou de types mixtes et les champs uniquement null. Donnez à ces champs un type concret à partir d'un échantillon plus riche si possible, ou ajoutez serde_json à Cargo.toml.
Vérifiez Option vs requis
Les champs ne sont marqués Option<T> que lorsqu'un échantillon les omet. Collez une charge utile représentative pour que l'outil déduise précisément les champs requis et optionnels.

Questions fréquentes

Comment convertir du JSON en struct Rust ?
Collez votre JSON dans le champ de saisie. Le convertisseur l'analyse instantanément dans votre navigateur et génère à droite des struct Rust avec les dérivations serde. Cliquez sur Copier pour récupérer le résultat — sans envoi, sans compte, sans attente.
Génère-t-il les dérivations serde ? Ai-je besoin de serde et serde_json ?
Oui — la sortie utilise #[derive(Debug, Clone, Serialize, Deserialize)] par défaut. Ajoutez serde avec la fonctionnalité derive à votre Cargo.toml. Vous n'avez besoin de serde_json comme dépendance que si la sortie contient serde_json::Value, qui apparaît pour les tableaux vides ou mixtes et les champs uniquement null. Désactivez l'option serde pour émettre des struct simples.
Comment utiliser le struct généré pour analyser du JSON ?
Ajoutez serde_json à votre Cargo.toml, puis désérialisez en une ligne : let root: Root = serde_json::from_str(json)?;. La dérivation Deserialize générée fait le reste — utilisez serde_json::from_slice pour une tranche d'octets ou from_reader pour un fichier ou un corps HTTP, et serde_json::to_string pour resérialiser.
Comment les champs optionnels et null sont-ils gérés ?
Lorsqu'une clé apparaît dans certains éléments d'un tableau mais pas dans d'autres, elle devient un champ Option. Un champ toujours null devient un serde_json::Value optionnel. serde traite Option comme optionnel automatiquement, aucun attribut #[serde(default)] n'est donc ajouté ni requis.
Comment gère-t-il les clés camelCase et les mots-clés Rust ?
Les noms de champs sont convertis en snake_case idiomatique, et un attribut #[serde(rename)] les renvoie vers la clé JSON exacte. Les mots-clés réservés comme type ou match sont émis sous la forme type_ ou match_ avec un rename, ce qui est plus robuste que les identifiants bruts car cela couvre aussi self, crate et super.
Peut-il utiliser #[serde(rename_all)] au lieu de renommages par champ ?
L'outil émet un #[serde(rename)] par champ car cela fonctionne toujours — même quand une charge utile mélange camelCase, snake_case et clés irrégulières. Si tous les champs d'un struct partagent une même convention, supprimez ces attributs et placez plutôt un unique #[serde(rename_all = "camelCase")] sur le struct ; les deux se désérialisent à l'identique.
Quel type numérique Rust utilise-t-il ?
Les entiers deviennent i64, ou u64 lorsqu'une valeur dépasse i64::MAX, et basculent vers f64 au-delà de u64 — ainsi les grands identifiants restent intacts. Tout nombre écrit avec une virgule décimale ou un exposant (comme 1.0 ou 2e3) devient f64, car serde rejetterait un flottant dans un champ entier.
Comment les dates et horodatages sont-ils typés ?
JSON n'a pas de type date, donc les chaînes ISO comme 2011-01-25 ou les horodatages RFC 3339 ressortent en String. Pour une vraie gestion des dates, changez le champ en un type chrono — DateTime dans le fuseau Utc, ou NaiveDate — et activez la fonctionnalité serde de chrono. serde analyse alors RFC 3339 automatiquement.
Comment gérer les objets avec des clés dynamiques ou inconnues ?
Lorsque les clés varient — par exemple une table d'identifiants vers des valeurs — remplacez le struct généré par un HashMap indexé par String. Pour garder un struct typé tout en capturant les champs supplémentaires, ajoutez un champ #[serde(flatten)] de type HashMap. Pour des valeurs entièrement dynamiques, serde_json::Value est le type fourre-tout.
Mes données JSON sont-elles privées et sécurisées ?
Oui. La conversion s'exécute à 100 % dans votre navigateur en JavaScript. Votre JSON — y compris les jetons, identifiants ou données client — ne quitte jamais la page et n'est jamais envoyé à un serveur.
Puis-je générer des struct Rust simples sans serde ?
Oui. Désactivez l'option serde pour retirer la ligne use serde, les dérivations Serialize et Deserialize, et tous les attributs #[serde(rename)] — il ne reste que des struct propres. Vous pouvez aussi activer ou non les dérivations Debug et Clone ainsi que la visibilité pub.
L'outil est-il gratuit ? Faut-il un compte ?
Il est entièrement gratuit, sans inscription, sans limites et sans publicités encombrant l'espace de travail.