Naar de inhoud

JSON naar Rust Serde-structs omzetten — Numio

Genereert Rust-structuren met serde Serialize en Deserialize is afgeleid van een JSON-voorbeeld. Velden worden snake_case met een rename_all-attribuut, sleutels die ontbreken in sommige array-items worden Option<T> en nulwaarden worden serde_json::Value.

Een API-antwoord van derden typen voordat het wordt gedeserialiseerd met serde_json in een reqwest-client.

JSON

Rust Serde

Wanneer gebruik je dit?

  • Een API-antwoord van derden typen voordat het wordt gedeserialiseerd met serde_json in een reqwest-client.
  • Structuren schrijven voor een JSON-configuratie- of armatuurbestand in een Rust CLI- of Axum-service.

Hoe werkt het

  1. Plak het JSON-voorbeeld; als een veld optioneel is, neem dan zowel array-items met als zonder veld op.
  2. Open de instellingen en kies Property Name Format zodat deze overeenkomt met de sleutels in uw JSON (standaard camelCase). Het stelt #[serde(rename_all = ...)] in; sleutels die niet passen krijgen #[serde(rename = ...)].
  3. Kopieer de code en voeg serde (met derivaat), serde_derive en serde_json toe aan Cargo.toml, zoals de gegenereerde gebruiksregels verwachten.

JSON-ingang

{
  "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 en beperkingen

Generatie draait in uw browser met de json_typegen WebAssembly module; er wordt niets naar een server verzonden.

Gehele getallen worden i64, decimalen f64. null en lege arrays geven serde_json::Value en Vec<Value>; vervang ze door betonsoorten zoals Option<String>.

Rust-trefwoorden worden hernoemd: een sleutel met de naam type wordt type_field met #[serde(rename = "type")].

Elke structuur is afgeleid van Default, Debug, Clone en PartialEq, evenals Serialize en Deserialize; verwijder degene die u niet nodig heeft.

FAQ

Wat verandert de instelling Property Name Format?

Het beschrijft hoe de sleutels in uw JSON worden geschreven, niet de Rust-veldnamen. Velden zijn altijd snake_case; de instelling kiest de rename_all-waarde, zodat deze terug wordt toegewezen aan camelCase, kebab-case, PascalCase enzovoort.

Hoe worden optionele velden gedetecteerd?

Wanneer objecten in dezelfde array verschillende sleutels hebben, worden sleutels die bij sommige items ontbreken Option<T>. Een veld dat in elk voorbeelditem aanwezig is, is niet optioneel, zelfs als uw API dit soms weglaat.

Kan de root van de JSON een array zijn?

Ja. Een rootarray produceert pubtype Root = Vec<Root2>; met een struct Root2 voor de items.

Specificaties en referenties