Convertir JSON en structures Rust Serde — Numio
Génère des structs Rust avec les derives serde Serialize et Deserialize à partir d’un échantillon JSON. Les champs passent en snake_case avec un attribut rename_all, les clés absentes de certains éléments d’un tableau deviennent Option<T> et les valeurs null deviennent serde_json::Value.
Typer la réponse d’une API tierce avant de la désérialiser avec serde_json dans un client reqwest.
JSON
Rust Serde
Quand l’utiliser
- Typer la réponse d’une API tierce avant de la désérialiser avec serde_json dans un client reqwest.
- Écrire des structs pour un fichier de configuration ou une fixture JSON dans une CLI Rust ou un service Axum.
Mode d’emploi
- Collez l’échantillon JSON ; si un champ est optionnel, incluez des éléments de tableau avec et sans ce champ.
- Ouvrez les paramètres et choisissez Property Name Format selon l’écriture des clés de votre JSON (camelCase par défaut). Cela définit #[serde(rename_all = ...)] ; les clés qui ne correspondent pas reçoivent #[serde(rename = ...)].
- Copiez le code et ajoutez serde (avec derive), serde_derive et serde_json à Cargo.toml, comme l’attendent les lignes use générées.
Entrée JSON
{
"orderId": "A-1001",
"total": 19.5,
"paid": true,
"coupon": null,
"items": [
{ "sku": "PEN-01", "qty": 2 },
{ "sku": "BOOK-7", "qty": 1, "giftWrap": true }
]
}Structs Rust (serde)
use serde_derive::Deserialize;
use serde_derive::Serialize;
use serde_json::Value;
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Root {
pub order_id: String,
pub total: f64,
pub paid: bool,
pub coupon: Value,
pub items: Vec<Item>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Item {
pub sku: String,
pub qty: i64,
pub gift_wrap: Option<bool>,
}Détails et limites
La génération s’exécute dans votre navigateur avec le module WebAssembly json_typegen ; rien n’est envoyé à un serveur.
Les entiers deviennent i64, les décimaux f64. null et les tableaux vides donnent serde_json::Value et Vec<Value> ; remplacez-les par des types concrets comme Option<String>.
Les mots-clés Rust sont renommés : une clé nommée type devient type_field avec #[serde(rename = "type")].
Chaque struct dérive Default, Debug, Clone et PartialEq en plus de Serialize et Deserialize ; supprimez ceux dont vous n’avez pas besoin.
FAQ
Que change le paramètre Property Name Format ?
Il décrit l’écriture des clés de votre JSON, pas les noms des champs Rust. Les champs sont toujours en snake_case ; le paramètre choisit la valeur de rename_all pour que serde les fasse correspondre à camelCase, kebab-case, PascalCase, etc.
Comment les champs optionnels sont-ils détectés ?
Quand les objets d’un même tableau ont des clés différentes, les clés absentes de certains éléments deviennent Option<T>. Un champ présent dans tous les éléments de l’échantillon n’est pas optionnel, même si votre API l’omet parfois.
La racine du JSON peut-elle être un tableau ?
Oui. Un tableau racine produit pub type Root = Vec<Root2>; avec une struct Root2 pour les éléments.