Zum Inhalt springen

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

  1. Füge das JSON-Beispiel ein; ist ein Feld optional, nimm Array-Elemente mit und ohne dieses Feld auf.
  2. Ö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 = ...)].
  3. 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.

Spezifikationen und Referenzen