JSON in Rust-Strukturen für Serde umwandeln — Numio
Erzeugt Rust-Structs mit den serde-Derives Serialize und Deserialize aus einem JSON-Beispiel. Felder werden snake_case mit einem rename_all-Attribut, Schlüssel, die in einigen Array-Elementen fehlen, werden zu Option<T>, und null-Werte werden zu serde_json::Value.
Die Antwort einer Drittanbieter-API typisieren, bevor du sie in einem reqwest-Client mit serde_json deserialisierst.
JSON
Rust Serde
Wann sie hilft
- Die Antwort einer Drittanbieter-API typisieren, bevor du sie in einem reqwest-Client mit serde_json deserialisierst.
- Structs für eine JSON-Konfigurations- oder Fixture-Datei in einem Rust-CLI oder Axum-Service schreiben.
Anwendung
- Füge das JSON-Beispiel ein; ist ein Feld optional, nimm Array-Elemente mit und ohne dieses Feld auf.
- Öffne die Einstellungen und wähle unter Property Name Format die Schreibweise der Schlüssel in deinem JSON (Standard camelCase). Daraus wird #[serde(rename_all = ...)]; Schlüssel, die nicht passen, erhalten #[serde(rename = ...)].
- Kopiere den Code und füge serde (mit derive), serde_derive und serde_json zur Cargo.toml hinzu, wie es die erzeugten use-Zeilen erwarten.
JSON-Eingabe
{
"orderId": "A-1001",
"total": 19.5,
"paid": true,
"coupon": null,
"items": [
{ "sku": "PEN-01", "qty": 2 },
{ "sku": "BOOK-7", "qty": 1, "giftWrap": true }
]
}Rust-Structs (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>,
}Details und Einschränkungen
Die Erzeugung läuft in deinem Browser mit dem WebAssembly-Modul json_typegen; nichts wird an einen Server gesendet.
Ganze Zahlen werden zu i64, Dezimalzahlen zu f64. null und leere Arrays ergeben serde_json::Value und Vec<Value>; ersetze sie durch konkrete Typen wie Option<String>.
Rust-Schlüsselwörter werden umbenannt: Ein Schlüssel namens type wird zu type_field mit #[serde(rename = "type")].
Jedes Struct leitet neben Serialize und Deserialize auch Default, Debug, Clone und PartialEq ab; entferne die, die du nicht brauchst.
FAQ
Was ändert die Einstellung Property Name Format?
Sie beschreibt, wie die Schlüssel in deinem JSON geschrieben sind, nicht die Rust-Feldnamen. Felder sind immer snake_case; die Einstellung wählt den rename_all-Wert, damit serde sie auf camelCase, kebab-case, PascalCase usw. zurückabbildet.
Wie werden optionale Felder erkannt?
Haben Objekte im selben Array unterschiedliche Schlüssel, werden die in einigen Elementen fehlenden Schlüssel zu Option<T>. Ein Feld, das in jedem Beispielelement vorkommt, ist nicht optional, auch wenn deine API es manchmal weglässt.
Kann die oberste Ebene des JSON ein Array sein?
Ja. Ein Root-Array erzeugt pub type Root = Vec<Root2>; mit einem struct Root2 für die Elemente.