Aller au contenu

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

  1. Collez l’échantillon JSON ; si un champ est optionnel, incluez des éléments de tableau avec et sans ce champ.
  2. 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 = ...)].
  3. 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.

Spécifications et références