logo
GeekFormat

JSON vers Rust

Outil en ligne gratuit JSON vers Rust qui génère automatiquement des struct avec derive Serde à partir du JSON de réponse API collé, séparation indépendante des objets imbriqués, inférence intelligente Vec et Option, conversion purement locale dans le navigateur, sans inscription.

Recommandations connexes

À propos de JSON vers Rust : transformer les données JSON en structures Rust compilables

JSON vers Rust est le processus de conversion de données au format JSON (objets ou tableaux) en définitions de type struct Rust. Rust est un langage de programmation à système de types forts, largement utilisé pour les services backend, outils CLI, WebAssembly, embarqué et blockchain. En développement, il est fréquent de devoir convertir des échantillons JSON de la documentation d'API ou de réponses réelles en types Rust ; écrire des struct manuellement est non seulement répétitif mais aussi sujet aux erreurs de type de champs, l'objectif de cet outil est d'automatiser ce processus, permettant aux développeurs de se concentrer sur la logique métier.

Cet outil est basé sur quicktype-core exécuté localement dans le navigateur, utilise les options de rendu just-types et no-comments pour générer du code structure Rust pur. La sortie inclut use serde::{Serialize, Deserialize}; et le #[derive(Serialize, Deserialize)] correspondant, utilisable directement avec serde_json pour la désérialisation. Cela signifie que ce que vous obtenez n'est pas simplement une ébauche de type, mais du code Rust qui peut être placé dans un projet Cargo, compilé et exécuté avec une configuration minimale des dépendances.

L'inférence de type est au cœur de JSON vers Rust. L'outil mappe les types de base JSON vers les types standard Rust : les chaînes deviennent String, les entiers i64, les flottants f64, les booléens bool, les tableaux Vec<T>, les objets imbriqués des struct indépendantes, les valeurs null Option<serde_json::Value>. Pour les objets imbriqués, l'outil crée automatiquement une nouvelle struct pour chaque niveau, nommée selon la capitalisation du nom de champ, par exemple le champ address générera une structure Address, les objets dans le tableau items généreront une structure Item.

Contrairement à certains outils en ligne qui nécessitent d'envoyer le JSON à un serveur pour traitement, tous les calculs de cet outil s'effectuent dans le navigateur. quicktype-core est chargé et exécuté via Web Worker, l'analyse JSON, l'inférence de type, la génération de code Rust et le téléchargement de fichiers se font tous localement, aucune donnée n'est envoyée à un serveur. C'est particulièrement important pour les JSON contenant des clés API, champs de confidentialité utilisateur ou structures métier non lancées, les données sont effacées de la mémoire à la fermeture de la page, c'est un choix sécurisé pour la désérialisation JSON en réseau interne d'entreprise.

Le code généré doit généralement être placé dans un projet Cargo pour utilisation. Vous devez ajouter les dépendances serde = { version = "1", features = ["derive"] } et serde_json = "1" dans Cargo.toml, puis copier la struct générée dans un fichier .rs sous src, et l'introduire via une déclaration mod. Vous pouvez ensuite utiliser serde_json::from_str::<User>(&json_string) pour convertir les réponses API réelles en structures fortement typées, bénéficiant de la vérification de type à la compilation de Rust. Pour les frameworks Web Rust majeurs comme Actix-web, axum, Rocket, Warp, la struct générée s'utilise directement comme paramètre de gestionnaire et modèle de réponse.

Il est important de noter que le code généré automatiquement est un point de départ et non une fin. L'outil infère les types à partir d'échantillons JSON, il ne peut pas déterminer les types précis au niveau métier (par exemple les types sémantiques comme URL, Email, ID, horodatage sont tous uniformément inférés comme String ou i64). Pour les champs JSON en snake_case, les champs struct Rust sont générés tels quels, vous devrez peut-être ajouter manuellement #[serde(rename = "user_name")] pour maintenir le mappage de désérialisation, ou remplacer String par chrono::DateTime<Utc>, uuid::Uuid, url::Url et autres types sémantiques. Il est recommandé d'utiliser le résultat généré comme première version, puis d'affiner les noms de champs, types et annotations selon les normes du projet.

Cas d'utilisation

  • Intégration REST API : convertissez la réponse JSON renvoyée par le backend en struct Rust, utilisez avec reqwest + serde_json pour une analyse fortement typée des corps de requête et réponses HTTP
  • Développement backend Actix-web : convertissez les exemples JSON de paramètres d'API en struct Rust, utilisez directement comme paramètre web::Json<T> ou modèle de réponse pour compiler et exécuter
  • Développement backend axum : convertissez les paramètres JSON des gestionnaires axum en struct Rust, utilisez avec l'extracteur Json<T> pour traiter les corps de requête POST
  • Définition d'interfaces de microservices : convertissez les exemples JSON de corps de requête de services gRPC/HTTP en types Rust, unifiez les définitions de modèles côté serveur à partager entre plusieurs équipes
  • Développement d'outils CLI : convertissez les exemples JSON de fichiers de configuration en struct Rust, utilisez avec serde + clap pour analyser les arguments de ligne de commande et la configuration
  • Projets WebAssembly : consommez fortement typé les données JSON transmises par le frontend JS côté Rust/WASM avec la struct générée, réduisez les erreurs de type à l'exécution
  • Applications de bureau Tauri : convertissez le payload JSON d'invoke frontend en struct Rust, utilisez comme type de paramètre #[tauri::command]
  • Analyse de données de scraping : convertissez les données JSON extraites de pages web en types Rust, évitez les oublis de champs dus à l'accès dynamique avec serde_json::Value
  • Développement de jeux : convertissez les données JSON de configuration de niveaux, attributs de personnages en struct Rust, facilitez la lecture des ressources de configuration par des moteurs comme Bevy
  • IoT et embarqué : convertissez les données JSON de capteurs rapportées par les appareils en types Rust, pour l'analyse et la validation des messages d'appareils périphériques (nécessite une adaptation no_std)
  • Migration de base de données : convertissez les documents JSON exportés depuis MongoDB / PostgreSQL en modèles Rust, comme référence pour la définition d'entités Diesel / SQLx
  • Blockchain/Web3 : convertissez les réponses JSON RPC on-chain en struct Rust, pour l'encapsulation de types de SDK comme solana-sdk / substrate
  • Construction de données de test : convertissez les fixtures JSON réelles renvoyées par le backend en types Rust, effectuez des assertions structurées et des tests golden dans les tests unitaires
  • Analyse structurée de journaux : convertissez les journaux JSON collectés par ELK / Loki / Vector en types Rust, facilitez le filtrage, les règles d'alerte et l'extraction de champs
  • Migration de centre de configuration : convertissez les configurations JSON d'Apollo / Nacos / Consul en types Rust, pour le rechargement à chaud et la validation de configuration côté serveur
  • Collaboration inter-langages : lors de l'intégration entre backend Rust et frontend TypeScript, convertissez le même JSON en struct Rust et interface TS pour maintenir la cohérence des deux côtés
  • Maintenance de SDK open source : générez des modèles Rust à partir des exemples JSON de la documentation d'API amont, publiez rapidement un SDK client Rust (publication crates.io)
  • Exemples pédagogiques Rust : dans les cours, convertissez des exemples JSON en struct, enseignez le processus de désérialisation Serde, les concepts de propriété et de cycle de vie
  • Conversion de noms de champs : après conversion de réponses API JSON en snake_case en structures Rust, ajoutez manuellement #[serde(rename)] pour le mappage de champs afin de maintenir la cohérence du style de nommage

Comment utiliser

  1. Collez le contenu JSON (objet ou tableau recommandé) dans l'éditeur de gauche, ou cliquez sur le bouton de téléchargement pour sélectionner un fichier .json / .txt, vous pouvez également cliquer sur « Sample » pour charger l'exemple chinois
  2. Attendez 400 ms pour la conversion automatique, le code struct Rust généré s'affichera à droite (avec use serde et #[derive(Serialize, Deserialize)])
  3. Si le format JSON est incorrect, un message d'erreur rouge s'affiche à droite, cliquez sur le bouton « Réparer JSON » pour corriger automatiquement les problèmes de syntaxe courants (virgules traînantes, guillemets simples, guillemets manquants, etc.)
  4. Cliquez sur le bouton « Copier » pour coller le code Rust généré dans le répertoire src du projet Cargo, ou cliquez sur le bouton « Télécharger » pour sauvegarder en fichier .rs
  5. Ajoutez les dépendances serde = { version = "1", features = ["derive"] } et serde_json = "1" dans Cargo.toml, puis exécutez cargo build pour valider la compilation
  6. (Facultatif) Ajustez manuellement les types de champs selon les besoins métier (comme i64 → u32), ajoutez #[serde(rename)] pour gérer le mappage snake_case et camelCase, complétez les types sémantiques comme chrono::DateTime

Fonctionnalités

  • Conversion locale dans le navigateur : l'analyse JSON et la génération de code Rust s'effectuent entièrement dans le navigateur via le Web Worker quicktype-core, aucune donnée n'est envoyée à un serveur
  • Sortie Serde-ready : génère automatiquement use serde::{Serialize, Deserialize}; et #[derive(Serialize, Deserialize)], utilisable directement avec serde_json pour désérialiser des réponses API réelles
  • Inférence de type intelligente : String pour chaînes, i64 pour entiers, f64 pour flottants, bool pour booléens, Vec<T> pour tableaux, struct indépendante pour objets imbriqués, Option<serde_json::Value> pour null
  • Séparation automatique des objets imbriqués : les objets imbriqués génèrent des struct indépendantes nommées par capitalisation du nom de champ (address → Address), évite les définitions dupliquées, prend en charge l'imbrication de tout niveau
  • Traitement automatique Vec et Option : les tableaux JSON sont uniformément convertis en Vec<T>, les valeurs null en Option<serde_json::Value>, réduit le travail de saisie manuelle des types
  • Prêt à l'emploi Actix-web / axum / reqwest : la struct générée s'utilise directement pour les corps de requête de gestionnaires Web, les modèles de réponse de clients HTTP, les structures de données Tauri
  • Conversion automatique avec anti-rebond de 400 ms : conversion dès le collage, aperçu du code Rust en temps réel à droite, évite les clics inutiles et les ralentissements avec les grands JSON
  • Réparation d'erreurs JSON en un clic : corrige automatiquement les erreurs courantes comme virgules traînantes, guillemets simples, guillemets manquants, commentaires, continue la génération après réparation
  • Copie et téléchargement : cliquez pour copier tout le code Rust dans le presse-papier, ou téléchargez en fichier .rs à placer directement dans le répertoire src d'un projet Cargo
  • Historique localStorage : sauvegarde automatiquement les dernières entrées, permet une reprise rapide après actualisation ou fermeture accidentelle
  • Colonnes réactives : édition JSON à gauche, code Rust à droite, prend en charge le redimensionnement des panneaux par glisser-déposer, adapté aux grands écrans et mobiles
  • Données d'exemple + téléchargement de fichiers : exemple chinois intégré (avec address / company / tags imbriqués), prend en charge le glisser-déposer ou le clic pour téléverser des fichiers .json / .txt

Exemples de code

Rust : gestionnaire Actix-web recevant un corps de requête JSON

rust

Utilisez Actix-web 4.x avec la struct générée comme paramètre web::Json<T>, le corps de requête HTTP POST est automatiquement désérialisé.

// Cargo.toml
// [dependencies]
// actix-web = "4"
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"

use actix_web::{web, App, HttpServer, HttpResponse, Responder};
use serde::{Deserialize, Serialize};

// Généré automatiquement par cet outil (depuis JSON)
#[derive(Serialize, Deserialize, Debug)]
pub struct CreateUserRequest {
    name: String,
    email: String,
    age: i64,
    tags: Vec<String>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct User {
    id: i64,
    name: String,
    email: String,
    age: i64,
    tags: Vec<String>,
}

// Gestionnaire Actix-web : paramètre JSON automatiquement désérialisé
async fn create_user(payload: web::Json<CreateUserRequest>) -> impl Responder {
    let req = payload.into_inner();
    let user = User {
        id: 1,
        name: req.name,
        email: req.email,
        age: req.age,
        tags: req.tags,
    };
    HttpResponse::Ok().json(user) // La réponse est également sérialisée avec serde_json
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .route("/users", web::post().to(create_user))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

/*
 * Appel client :
 * curl -X POST http://127.0.0.1:8080/users \
 *   -H "Content-Type: application/json" \
 *   -d '{"name":"Alice","email":"alice@example.com","age":30,"tags":["rust","actix"]}'
 */

Rust : routage axum + analyse de réponse client reqwest

rust

Côté serveur axum avec extracteur Json<T>, côté client reqwest désérialise la réponse avec .json::<T>(), la struct générée est compatible bidirectionnelle.

// Cargo.toml
// [dependencies]
// axum = "0.7"
// tokio = { version = "1", features = ["full"] }
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"
// reqwest = { version = "0.12", features = ["json"] }

use axum::{routing::get, Json, Router};
use serde::{Deserialize, Serialize};

// Généré automatiquement par cet outil
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Address {
    city: String,
    zip: String,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct User {
    id: i64,
    name: String,
    email: String,
    address: Address,
    tags: Vec<String>,
}

// Gestionnaire axum : retourne une réponse JSON
async fn get_user() -> Json<User> {
    Json(User {
        id: 1,
        name: "Alice".into(),
        email: "alice@example.com".into(),
        address: Address { city: "Beijing".into(), zip: "100000".into() },
        tags: vec!["rust".into(), "axum".into()],
    })
}

// Client reqwest : désérialise la réponse d'API distante
async fn fetch_user(url: &str) -> Result<User, reqwest::Error> {
    let user: User = reqwest::get(url).await?.json().await?;
    Ok(user)
}

#[tokio::main]
async fn main() {
    // Démarrer le service axum
    let app = Router::new().route("/user", get(get_user));
    let listener = tokio::net::TcpListener::bind("127.0.0.1:8080").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

/*
 * Accès après compilation :
 * curl http://127.0.0.1:8080/user
 * {"id":1,"name":"Alice","email":"alice@example.com",
 *  "address":{"city":"Beijing","zip":"100000"},
 *  "tags":["rust","axum"]}
 */

Rust : renommage de champs snake_case + mappage de types personnalisés

rust

Quand les champs JSON sont en snake_case et que vous voulez des champs Rust en camelCase, utilisez #[serde(rename)] pour un mappage explicite, et remplacez les types sémantiques par chrono::DateTime.

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
pub struct Article {
    #[serde(rename = "article_id")]
    pub article_id: i64,

    #[serde(rename = "title")]
    pub title: String,

    // JSON: "2026-07-08T10:00:00Z" → chrono::DateTime<Utc>
    #[serde(rename = "created_at")]
    pub created_at: DateTime<Utc>,

    #[serde(rename = "view_count")]
    pub view_count: i64,

    // Champs manquants utilisent Default::default()
    #[serde(rename = "summary", default)]
    pub summary: Option<String>,

    #[serde(rename = "tags")]
    pub tags: Vec<String>,
}

fn main() -> Result<(), serde_json::Error> {
    let json = r#"{
        "article_id": 42,
        "title": "Hello Rust",
        "created_at": "2026-07-08T10:00:00Z",
        "view_count": 1024,
        "tags": ["rust", "serde"]
    }"#;

    let article: Article = serde_json::from_str(json)?;
    println!("{:?}", article);
    // Article { article_id: 42, title: "Hello Rust",
    //   created_at: 2026-07-08 10:00:00 UTC, view_count: 1024, ... }

    // Sérialisation inverse : valeur Rust → chaîne JSON
    let s = serde_json::to_string(&article)?;
    println!("{}", s);
    Ok(())
}

/*
 * Dépendances Cargo.toml :
 * serde = { version = "1", features = ["derive"] }
 * serde_json = "1"
 * chrono = { version = "0.4", features = ["serde"] }
 */

Rust : commande Tauri 2.x recevant le payload d'invoke frontend

rust

Utilisez la struct générée comme type de paramètre d'un #[tauri::command] Tauri, lors de l'invoke frontend le payload est automatiquement désérialisé depuis JSON.

// Cargo.toml
// [dependencies]
// tauri = { version = "2", features = [] }
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"

use serde::{Deserialize, Serialize};

// Généré automatiquement par cet outil
#[derive(Serialize, Deserialize, Debug)]
pub struct CreateNoteRequest {
    pub title: String,
    pub content: String,
    pub tags: Vec<String>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct Note {
    pub id: i64,
    pub title: String,
    pub content: String,
    pub tags: Vec<String>,
    pub created_at: String, // Peut être modifié manuellement en chrono::DateTime<Utc>
}

// Commande Tauri : appelée par le frontend via invoke('create_note', payload)
#[tauri::command]
fn create_note(payload: CreateNoteRequest) -> Result<Note, String> {
    let note = Note {
        id: 1,
        title: payload.title,
        content: payload.content,
        tags: payload.tags,
        created_at: "2026-07-14T10:00:00Z".to_string(),
    };
    Ok(note)
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![create_note])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

/*
 * Exemple d'appel frontend (TypeScript):
 *
 * import { invoke } from '@tauri-apps/api/core';
 * const note = await invoke<Note>('create_note', {
 *   payload: { title: 'Hello', content: 'World', tags: ['rust', 'tauri'] }
 * });
 */

Best Practices

L'outil infère des types de base comme String / i64 / f64 à partir de l'échantillon JSON, mais au niveau métier il existe des types sémantiques plus précis comme chrono::DateTime<Utc>, uuid::Uuid, url::Url, std::net::IpAddr, rust_decimal::Decimal. Il est recommandé de remplacer immédiatement ces champs par des types métier après génération, pour que le système de types capture plus d'erreurs.

Ne renommez pas le champ généré user_name en userName pour adapter la convention de nommage Rust, cela ferait échouer la désérialisation Serde. La bonne pratique est de conserver le nom de champ snake_case + #[serde(rename = "userName")], ou d'ajouter #[serde(rename_all = "camelCase")] sur l'ensemble de la struct.

Pour la rétrocompatibilité lors des itérations de version d'API (les nouveaux champs ne font pas échouer la désérialisation des anciens clients), il est recommandé d'ajouter #[serde(default)] à tous les champs Option<T> ou champs autorisant la valeur par défaut. Ainsi même si le champ est absent du JSON, Default::default() peut servir de repli, évitant l'échec de désérialisation de toute la requête.

Bien que l'outil s'exécute entièrement localement sans envoyer aucune donnée, il est recommandé d'anonymiser ou supprimer les champs sensibles comme clés API, access_token, numéros de carte d'identité utilisateur avant collage, pour éviter des résidus en mémoire après fermeture accidentelle du navigateur (bien que ce soit effacé à la fermeture). C'est une bonne hygiène de sécurité.

Quand le niveau d'imbrication JSON est ≥ 3, l'outil génère plusieurs struct imbriquées. Il est recommandé de placer la struct racine dans src/models/user.rs, les struct imbriquées (comme Address, Company) dans le sous-répertoire src/models/, puis de les organiser via des déclarations mod, facilitant la maintenance des grands projets.

Le code généré respecte par défaut les normes Rust, mais clippy peut suggérer des améliorations (comme suggérer de remplacer String par &str, i64 par usize, etc.). Exécuter cargo clippy --all-targets -- -D warnings permet de découvrir des points d'optimisation de type potentiels.

La struct générée par cet outil utilise par défaut String / Vec<T>, qui dépendent de l'allocation sur le tas de std. Dans les environnements embarqués / no_std, il faut remplacer manuellement par &'static str, heapless::String, NVec<T, N> et autres types sans allocation sur le tas, et s'assurer que le type correspondant implémente serde::Deserialize.

Quand un seul JSON dépasse 5 Mo, le traitement WASM du navigateur ralentit et l'occupation mémoire est élevée. Recommandations : ① divisez le JSON par module métier ; ② convertissez chaque module séparément avec cet outil ; ③ réassemblez dans le projet Cargo. Cela garantit à la fois la vitesse de conversion et la maintenabilité du code.

FAQ

Comment convertir JSON en struct Rust ?

Collez le contenu JSON dans l'éditeur de gauche, ou cliquez sur le bouton de téléchargement pour sélectionner un fichier .json / .txt, vous pouvez également cliquer sur « Sample » pour charger l'exemple chinois. L'outil appellera automatiquement quicktype-core dans les 400 ms pour générer du code Rust, la struct avec derive Serde s'affichera à droite. Si le format JSON est incorrect, cliquez sur le bouton « Réparer JSON » pour corriger automatiquement avant conversion.

Le code Rust généré inclut-il les annotations serde ?

Oui. L'outil utilise le mode de rendu just-types de quicktype-core, générant pour Rust use serde::{Serialize, Deserialize}; et #[derive(Serialize, Deserialize)], utilisables directement avec serde_json pour la désérialisation. Si vous n'avez pas besoin de Serde, vous pouvez supprimer manuellement le derive et les instructions use.

Quelles structures de données JSON sont prises en charge ?

Prend en charge toutes les structures JSON valides : types de base (null, boolean, number, string), tableaux (unidimensionnels ou multidimensionnels), objets imbriqués (profondeur arbitraire). Les objets JSON génèrent une struct racine, les tableaux JSON génèrent un type racine Vec<T>. Ne prend pas en charge les valeurs non JSON comme les littéraux d'objet JavaScript, fonctions, Symbol, undefined.

Comment les types de champs JSON sont-ils mappés vers les types Rust ?

Les chaînes deviennent String, les entiers i64, les flottants f64, les booléens bool, les tableaux Vec<T>, les objets imbriqués des struct indépendantes, null devient Option<serde_json::Value>. Consultez le « Tableau de correspondance rapide JSON vers types Rust » en bas de page pour les règles de mappage détaillées.

Quel type est généré pour les valeurs null ?

Les valeurs null dans JSON génèrent Option<serde_json::Value>, indiquant que le champ peut manquer ou avoir un type indéterminé. Si vous connaissez le type réel du champ, fournissez une valeur d'exemple dans le JSON source (ex. "field": "" est inféré comme String), puis modifiez en Option<String>, Option<i64> ou d'autres types plus précis selon les besoins métier après génération.

Les tableaux sont-ils convertis en Vec ?

Oui. Les tableaux JSON sont uniformément convertis en le générique Rust Vec<T>, le type des éléments est automatiquement inféré depuis le premier élément du tableau. Par exemple ["a","b"] génère Vec<String>, [1,2,3] Vec<i64>, [{...},{...}] Vec<Item>. Un tableau vide [] génère par défaut Vec<serde_json::Value>, modifiable manuellement en type concret après génération selon le contexte.

Comment les objets imbriqués sont-ils traités ?

Chaque objet imbriqué génère une struct indépendante, nommée selon la capitalisation du nom de champ. Par exemple si l'objet racine contient un champ address, deux structures Root et Address sont générées simultanément, référencées dans Root via address: Address. Les objets de même structure partagent le même type, évitant les définitions dupliquées.

Peut-on personnaliser le nom de la structure générée ?

quicktype-core utilise par défaut le nom de la source JSON (comme User) comme nom de structure racine. Vous pouvez modifier manuellement le nom de la struct et ses références après génération. Le nom de fichier .rs téléchargé peut également être renommé lors de l'enregistrement selon vos besoins. Si vous souhaitez que l'outil nomme automatiquement selon un champ, ajustez la clé de niveau supérieur du JSON avant de coller.

Le code généré peut-il être utilisé directement dans un projet Cargo ?

Il est utilisable directement, mais assurez-vous que le projet a bien引入 les dépendances serde et serde_json. Ajoutez serde = { version = "1", features = ["derive"] } et serde_json = "1" dans Cargo.toml, puis vous pouvez utiliser serde_json::from_str::<User>(&json) ou serde_json::from_reader(reader) pour désérialiser la structure générée.

Peut-il être utilisé pour les corps de requête Actix-web / axum ?

Oui. Les extracteurs JSON d'Actix-web 4.x et axum 0.7+ sont tous deux basés sur serde_json, la struct générée s'utilise directement comme paramètre de gestionnaire. Par exemple dans axum : async fn create_user(Json(payload): Json<CreateUserRequest>) -> ... ; dans Actix-web : web::Json<CreateUserRequest>. Aucune annotation supplémentaire n'est nécessaire.

Peut-il être utilisé pour la désérialisation de réponse reqwest ?

Oui. response.json::<T>() de reqwest appelle en interne serde_json, passez simplement le type de struct généré : let user: User = reqwest::get(url).await?.json().await?; . Si les noms de champs de l'API backend sont en snake_case alors que les champs Rust sont en camelCase, ajoutez manuellement #[serde(rename = "user_name")].

Prend en charge les paramètres de commande Tauri ?

Oui. Les paramètres de fonction de commande Tauri sont désérialisés via serde, utilisez la struct générée comme type de paramètre : #[tauri::command] fn create_user(payload: CreateUserRequest) -> Result<User, String>. Lorsque le frontend JS appelle invoke('create_user', payload), le payload est automatiquement sérialisé en JSON puis désérialisé côté Rust.

Prend en charge les types précis comme chrono::DateTime et uuid::Uuid ?

L'outil génère par défaut des types de base comme String et i64. Si vous avez besoin de types sémantiques comme chrono::DateTime<Utc>, uuid::Uuid, url::Url, std::net::IpAddr, ajustez manuellement les types de champs après génération. Ces types implémentent tous Deserialize de Serde, il suffit de use chrono::{DateTime, Utc}; pour compiler.

Les données sont-elles envoyées au serveur ? Est-ce sécurisé pour la confidentialité ?

Exécution entièrement locale dans le navigateur. L'analyse JSON, la génération de code Rust et le téléchargement de fichiers s'effectuent tous dans le navigateur via JavaScript et le Web Worker quicktype-core, les données JSON saisies et le code Rust généré ne sont envoyés à aucun serveur, ni enregistrés ou mis en cache dans le cloud. Les JSON sensibles contenant des clés API, tokens, champs métier non publics peuvent être utilisés en toute confiance, ils sont effacés à la fermeture de la page.

Faut-il s'inscrire ou se connecter ?

Non. L'outil est entièrement gratuit, sans inscription, connexion ou autorisation nécessaire. Il est utilisable dès l'ouverture de la page, toutes les fonctionnalités sont disponibles localement dans le navigateur.

Que faire en cas d'erreur de format JSON ?

L'outil détecte automatiquement la validité du JSON, affiche un message d'erreur rouge à droite en cas d'erreur, et fournit un bouton « Réparer JSON ». Après clic, il corrige automatiquement les erreurs courantes : virgule de fin superflue, remplacement des guillemets simples par doubles, ajout de guillemets aux clés sans guillemets, suppression des commentaires, etc. La génération de code Rust se poursuit après réparation réussie.

La conversion d'un grand JSON va-t-elle ralentir ?

L'outil n'a pas de limite explicite de lignes, mais l'analyse et le rendu de très grands JSON par le navigateur peuvent ralentir. Recommandations : ① divisez le JSON puis convertissez par lots ; ② concentrez-vous sur un seul niveau d'imbrication à la fois ; ③ pour une génération par lot de plus de 100 structures, il est recommandé d'utiliser l'outil en ligne de commande quicktype (npm i -g quicktype) ou des plugins IDE.

Quelle est la différence entre cet outil et JSON vers TypeScript ?

Les deux convertissent du JSON en définitions de type du langage cible, mais la forme de sortie diffère : JSON vers Rust génère des struct avec derive Serde, ce sont des modèles de données désérialisables à l'exécution ; JSON vers TypeScript génère des déclarations de type interface / type, utilisables uniquement pour la vérification de type à la compilation. Le choix dépend de votre pile technique et du scénario d'exécution.

Le code généré peut-il être utilisé pour l'embarqué no_std ?

La définition de structure elle-même peut être no_std (dépend uniquement de core et non de std). Mais serde_json en no_std nécessite l'utilisation de serde_json::de::from_slice et l'activation des features correspondantes, et ne peut pas utiliser String (doit être remplacé par &str ou heapless::String). Dans les scénarios embarqués, il est généralement nécessaire d'ajuster manuellement les types de champs et l'allocateur.

Pourquoi les noms de champs générés ne correspondent-ils pas au JSON ?

L'outil conserve les noms de champs JSON d'origine (y compris snake_case), les champs Rust suivent par défaut la convention de nommage snake_case, donc ils ne présentent pas d'incohérence quand ils ont le même nom que le JSON. S'il y a une différence de nom de champ, c'est généralement parce que le JSON source contient des caractères spéciaux ou des clés dupliquées fusionnées, il est recommandé de nettoyer d'abord avec l'outil de réparation JSON avant conversion.

Dépannage

Message « Veuillez saisir des données JSON » ou partie droite vide

Message d'échec d'analyse JSON (Unexpected token)

Les types de champs générés ne sont pas assez précis (String au lieu de chrono::DateTime)

Le champ null a généré Option<serde_json::Value> au lieu d'Option<String>

Erreur de compilation : missing crate for serde / serde_json

Les champs JSON snake_case ne correspondent pas au style de nommage Rust et causent un échec de désérialisation

Erreur de compilation du fichier .rs téléchargé dans le projet

Ralentissement de la page ou dépassement de mémoire lors de la conversion d'un très grand JSON (>5Mo)

actix-web / axum indique the trait bound is not satisfied

Erreur invalid type lors de l'appel frontend d'un paramètre de commande Tauri

Glossaire

struct
Mot-clé Rust utilisé pour définir des types de données composites. Cet outil génère précisément des struct, par exemple pub struct User { id: i64, name: String }. Les champs sont publics par défaut (sans visibilité explicite ils sont private, le derive serde nécessite public).
Serde
Framework de sérialisation/désérialisation le plus populaire de l'écosystème Rust. Le code généré par cet outil s'associe à Serde via #[derive(Serialize, Deserialize)], permettant l'analyse avec de multiples formats comme serde_json, bincode, toml, postcard.
derive macro
Macro procédurale Rust, implémente automatiquement des trait pour un type. Le #[derive(Serialize, Deserialize)] généré par cet outil implémente automatiquement les traits de sérialisation et désérialisation de Serde, pas besoin d'écrire de bloc impl manuellement.
Vec<T>
Type tableau dynamique de la bibliothèque standard Rust. Cet outil mappe automatiquement les tableaux JSON en Vec<T>, par exemple un tableau de chaînes devient Vec<String>. Vec possède une mémoire allouée sur le tas, dont le cycle de vie est géré automatiquement par le compilateur Rust.
Option<T>
Type valeur optionnelle de la bibliothèque standard Rust, indique qu'une valeur peut ne pas exister. Cet outil mappe le null JSON vers Option<serde_json::Value>, vous pouvez également modifier manuellement en Option<String> ou d'autres types plus précis, consommable via .unwrap() ou le pattern matching.
Cargo
Système de build et gestionnaire de paquets officiel de Rust. Lors de l'utilisation du code généré par cet outil, déclarez les dépendances serde et serde_json dans Cargo.toml, et exécutez cargo build / cargo run pour compiler et exécuter.
serde_json
Crate de Serde spécialisé dans le traitement JSON. L'usage typique est serde_json::from_str::<User>(&json_string) ou serde_json::from_reader(reader) pour convertir une chaîne/flux d'octets JSON en la struct Rust générée, c'est la dépendance sous-jacente du traitement JSON d'Actix-web / axum.
Serialize
Trait de sérialisation de Serde, indique qu'un type peut être encodé en JSON ou autres formats. Cet outil en génère automatiquement l'implémentation via derive, utilisable avec serde_json::to_string(&user) pour reconvertir une valeur Rust en chaîne JSON.
Deserialize
Trait de désérialisation de Serde, indique qu'un type peut être décodé depuis JSON ou autres formats. Cet outil en génère automatiquement l'implémentation via derive, utilisé avec serde_json::from_str, c'est le cœur de la désérialisation des corps de requête HTTP, fichiers de configuration, payload de files de messages.
Propriété (Ownership)
Concept central de gestion mémoire de Rust. Les types générés par cet outil comme String, Vec<T> possèdent leurs données respectives, dont le cycle de vie est géré automatiquement par le compilateur Rust après désérialisation, pas de libération manuelle nécessaire, pas de GC, pas de surcoût à l'exécution.
#[serde(rename = "...")]
Attribut de renommage de champ de Serde. Quand les noms de champs JSON (comme user_name) ne correspondent pas au style de nommage Rust, cette annotation indique à Serde de faire correspondre le nom JSON d'origine lors de la désérialisation. Couramment utilisé pour les projets Rust en camelCase s'interfaçant avec des API backend en snake_case.
#[serde(default)]
Attribut de valeur par défaut de champ de Serde. Quand un champ est absent du JSON, Default::default() du type est appelé. Couramment utilisé pour les scénarios de rétrocompatibilité lors de l'ajout de champs dans les itérations de version, évite l'échec de désérialisation des vieux JSON.
quicktype-core
Bibliothèque sous-jacente d'inférence de type multilingue et de génération de code utilisée par cet outil, originellement implémentée en TypeScript, compilée en WebAssembly puis exécutée dans le navigateur via Web Worker, prend en charge plus de 20 langages cibles comme Rust / TypeScript / Go / Python.
Web Worker
Mécanisme de thread d'arrière-plan fourni par le navigateur, permet à JavaScript d'exécuter des calculs coûteux dans un thread indépendant sans bloquer le thread principal. Cet outil utilise Web Worker pour charger le WASM quicktype-core, évite le gel de la page lors de la conversion de grands JSON.
WebAssembly (WASM)
Format d'instructions binaire pouvant être généré par compilation depuis C/C++/Rust etc., exécutable dans le navigateur à une vitesse proche du natif. Le moteur central de cet outil quicktype-core est précisément compilé en WASM puis exécuté dans le navigateur.
chrono
Bibliothèque de dates et heures la plus populaire de l'écosystème Rust, fournit des types comme DateTime<Utc>, NaiveDate, avec la feature serde activée elle peut s'associer à Serde pour analyser automatiquement les chaînes de date ISO 8601. Couramment utilisée pour remplacer les champs de temps String générés par défaut par cet outil.
no_std
Mode de compilation Rust qui désactive la bibliothèque standard std et n'utilise que la bibliothèque centrale core, adapté aux scénarios à ressources limitées comme l'embarqué, noyaux WebAssembly, systèmes d'exploitation. serde fonctionne également en no_std (activation des features correspondantes).
tokio
Runtime asynchrone le plus populaire de l'écosystème Rust, dont dépendent des bibliothèques majeures comme axum, reqwest, tonic. Le code généré par cet outil doit souvent être associé à la macro #[tokio::main] pour démarrer le runtime dans les scénarios asynchrones.

Tableau de correspondance rapide JSON vers types Rust

L'outil infère automatiquement le type Rust correspondant selon le type de valeur JSON :

Exemple de valeur JSONType Rust généréExplication
nullOption<serde_json::Value>Le type de la valeur null est indéterminé, Option enveloppant serde_json::Value comme solution de repli
true / falseboolLes booléens JSON sont directement mappés vers le bool Rust
42i64Les entiers JSON sont mappés par défaut en i64 (à modifier manuellement en u32 / usize etc. selon les besoins)
3.14f64Les flottants JSON sont mappés par défaut en f64 (f64 recommandé pour les scénarios haute précision)
"hello"StringLes chaînes JSON sont mappées en String Rust (modifiable manuellement en &str / chrono::DateTime / uuid::Uuid)
["a","b"]Vec<String>Les tableaux de chaînes deviennent Vec<String>
[1,2,3]Vec<i64>Les tableaux d'entiers deviennent Vec<i64>
[{...},{...}]Vec<Item>Les tableaux d'objets génèrent la struct correspondante à partir du premier élément, puis l'enveloppent dans Vec
[]Vec<serde_json::Value>Impossible d'inférer le type des éléments d'un tableau vide, serde_json::Value comme solution de repli, il est recommandé de modifier manuellement en type concret après génération
{...} objet imbriquéstruct indépendanteLes objets imbriqués génèrent une struct indépendante, nommée selon la capitalisation du nom de champ (ex. address → Address)
{ "key": null }Option<serde_json::Value>Quand la valeur d'un champ est null, elle est inférée par défaut comme Option<serde_json::Value>, modifiable manuellement en Option<String>

Explication de la structure du code Rust généré

Le code typique généré par quicktype-core pour Rust comprend les parties suivantes :

Partie du codeExempleRôle
use serde::{Serialize, Deserialize};use serde::{Serialize, Deserialize};Importer les traits de sérialisation et désérialisation de Serde
#[derive(Serialize, Deserialize)]#[derive(Serialize, Deserialize)]Faire générer automatiquement au compilateur les implémentations de trait Serde
pub struct Userpub struct User { id: i64 }Définir une structure publique et ses champs
Champ Vec<T>scores: Vec<i64>Représente un champ tableau JSON
Champ Option<T>label: Option<serde_json::Value>Représente un champ pouvant être null
Référence struct imbriquéeaddress: AddressReprésente un objet imbriqué, le type est généré automatiquement par l'outil

Intégration des frameworks Rust courants avec la struct générée par cet outil

La struct générée s'utilise directement dans les scénarios courants de l'écosystème Rust suivants :

Framework / OutilExemple d'usageDépendances nécessaires
Actix-web 4.xweb::Json<User>actix-web = "4", serde_json = "1"
axum 0.7Json<User>axum = "0.7", serde_json = "1", tokio = "1"
Rocket 0.5Json<User>rocket = { version = "0.5", features = ["json"] }
warp 0.3body::json::<User>()warp = "0.3", serde_json = "1"
reqwest 0.12response.json::<User>().awaitreqwest = { version = "0.12", features = ["json"] }
Tauri 2.xfn command(payload: User)tauri = "2", serde = { version = "1", features = ["derive"] }
Bevy 0.14Sérialisation Resource / Componentbevy = "0.14", serde = { version = "1", features = ["derive"] }
SQLx 0.7FromRow + champs serdesqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }

Tableau de référence des attributs Serde courants

Cet outil ne génère par défaut que #[derive(Serialize, Deserialize)], mais en projet réel des annotations d'attributs supplémentaires sont souvent nécessaires pour s'adapter aux scénarios métier :

AttributPortéeRôle
#[serde(rename = "userName")]ChampFait correspondre le nom JSON d'origine lors de la désérialisation (snake_case ↔ camelCase)
#[serde(rename_all = "camelCase")]structMappe en lot tous les champs en camelCase (affecte sérialisation et désérialisation)
#[serde(default)]ChampUtilise Default::default() comme solution de repli quand le champ est absent du JSON
#[serde(skip_serializing_if = "Option::is_none")]ChampNe sérialise pas le champ quand c'est None (pour nettoyer la sortie JSON)
#[serde(skip)]ChampIgnore complètement le champ (n'entre pas dans le JSON et n'est pas désérialisé depuis le JSON)
#[serde(flatten)]ChampAplatit les champs d'une struct imbriquée dans le JSON externe (adapté aux champs dynamiques)
#[serde(deny_unknown_fields)]structÉchec de la désérialisation quand le JSON contient des champs non déclarés (mode strict)
#[serde(tag = "type")]enumUtilise un champ JSON pour distinguer les variantes d'enum (mode étiquette interne)
#[serde(untagged)]enumInfère la variante d'enum selon le contenu JSON (mode sans étiquette)
#[serde(alias = "user_name")]ChampAjoute des alias de désérialisation supplémentaires au champ (compatibilité avec plusieurs clés JSON)

Privacy & Security

Toutes les opérations de cet outil JSON vers Rust s'effectuent entièrement localement dans votre navigateur : l'analyse JSON, la génération de code Rust et le téléchargement de fichiers sont tous exécutés côté client via le module WebAssembly quicktype-core, aucun contenu JSON, fichier téléchargé ou code généré n'est envoyé sur le réseau à un serveur quelconque. Le téléchargement de fichiers utilise l'API native FileReader du navigateur pour lire directement en mémoire, sans passer par aucun service intermédiaire. Pas de suivi par Cookie, aucune saisie utilisateur ou donnée d'utilisation n'est collectée. Après fermeture ou actualisation de la page, tous les contenus d'entrée et de sortie sont automatiquement effacés de la mémoire. Convient au traitement de JSON contenant des clés API, tokens, données de confidentialité utilisateur, structures métier non lancées, champs d'interfaces internes.

Authoritative References