snippetrustserdeModeratepending
Rust serde for serialization and deserialization
Viewed 0 times
serdeSerializeDeserializeJSONrenameskip
Problem
Need to convert Rust structs to/from JSON, YAML, TOML, or other data formats efficiently.
Solution
Use serde with derive macros:
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct User {
name: String,
email: String,
#[serde(default)] // Use Default if missing
age: Option<u32>,
#[serde(rename = "created_at")] // JSON field name differs
created: String,
#[serde(skip_serializing_if = "Option::is_none")] // Omit if None
bio: Option<String>,
#[serde(skip)] // Never serialize/deserialize
internal_id: u64,
}
// JSON
let json = serde_json::to_string_pretty(&user)?;
let user: User = serde_json::from_str(&json)?;
// From file
let user: User = serde_json::from_reader(File::open("user.json")?)?;
// Enum variants
#[derive(Serialize, Deserialize)]
#[serde(tag = "type")] // Internally tagged
enum Message {
#[serde(rename = "text")]
Text { content: String },
#[serde(rename = "image")]
Image { url: String, width: u32 },
}
// {"type": "text", "content": "hello"}
// Custom deserialization
#[derive(Deserialize)]
struct Config {
#[serde(deserialize_with = "deserialize_duration")]
timeout: Duration,
}
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct User {
name: String,
email: String,
#[serde(default)] // Use Default if missing
age: Option<u32>,
#[serde(rename = "created_at")] // JSON field name differs
created: String,
#[serde(skip_serializing_if = "Option::is_none")] // Omit if None
bio: Option<String>,
#[serde(skip)] // Never serialize/deserialize
internal_id: u64,
}
// JSON
let json = serde_json::to_string_pretty(&user)?;
let user: User = serde_json::from_str(&json)?;
// From file
let user: User = serde_json::from_reader(File::open("user.json")?)?;
// Enum variants
#[derive(Serialize, Deserialize)]
#[serde(tag = "type")] // Internally tagged
enum Message {
#[serde(rename = "text")]
Text { content: String },
#[serde(rename = "image")]
Image { url: String, width: u32 },
}
// {"type": "text", "content": "hello"}
// Custom deserialization
#[derive(Deserialize)]
struct Config {
#[serde(deserialize_with = "deserialize_duration")]
timeout: Duration,
}
Why
serde is the Rust ecosystem standard for serialization. Derive macros generate optimal code at compile time with zero runtime overhead.
Revisions (0)
No revisions yet.