// 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(())
}