Module 10 • Lesson 53

JSON with serde

📚 9 min💻 Free🦀 nixus.pro

JSON with serde

// Cargo.toml:
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"

use serde::{Deserialize, Serialize};
use serde_json::{json, Value};

#[derive(Debug, Serialize, Deserialize)]
struct Config {
    #[serde(rename = "appName")]  // Different JSON key
    app_name: String,
    version: u32,
    #[serde(default)]             // Use Default if missing
    debug: bool,
    #[serde(skip_serializing_if = "Option::is_none")] // Skip if None
    description: Option,
    tags: Vec,
    #[serde(flatten)]
    extra: std::collections::HashMap,
}

fn main() -> Result<(), serde_json::Error> {
    // Serialize to JSON string
    let config = Config {
        app_name: "MyApp".to_string(),
        version: 1,
        debug: true,
        description: Some("A great app".to_string()),
        tags: vec!["rust".to_string(), "fast".to_string()],
        extra: std::collections::HashMap::new(),
    };

    let json = serde_json::to_string(&config)?;
    println!("{}", json);

    let pretty = serde_json::to_string_pretty(&config)?;
    println!("{}", pretty);

    // Deserialize from JSON
    let json_str = r#"{"appName":"Test","version":2,"tags":[]}"#;
    let parsed: Config = serde_json::from_str(json_str)?;
    println!("{:?}", parsed);

    // Dynamic JSON with json! macro
    let dynamic = json!({
        "name": "Alice",
        "age": 30,
        "scores": [95, 87, 92],
        "address": { "city": "London" }
    });
    println!("{}", dynamic["name"]);
    println!("{}", dynamic["address"]["city"]);

    // Navigate arbitrary JSON
    let city: &str = dynamic["address"]["city"].as_str().unwrap_or("unknown");
    println!("City: {}", city);

    Ok(())
}

🎯 Practice

  1. Create a struct for a GitHub API user response and deserialize the real API response
  2. Handle an API that may return {"result": null} vs {"result": 42} using serde
  3. Serialize a struct where enums become lowercase strings using #[serde(rename_all = "lowercase")]

🎉 Key Takeaways