// Created on savesnippets.com · https://savesnippets.com/ehxJ67yefbazmO use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] // all fields camelCase in JSON struct ApiUser { user_id: u64, // → "userId" display_name: String, // → "displayName" #[serde(skip_serializing_if = "Option::is_none")] avatar_url: Option, // omitted from output if None #[serde(rename = "isAdmin", default)] admin: bool, } #[derive(Serialize, Deserialize, Debug)] #[serde(tag = "type", content = "data")] // externally-tagged form enum Event { UserSignedUp { user_id: u64 }, OrderPlaced { order_id: u64, total: f64 }, } fn main() { let u = ApiUser { user_id: 1, display_name: "Alice".into(), avatar_url: None, admin: true }; println!("{}", serde_json::to_string(&u).unwrap()); // {"userId":1,"displayName":"Alice","isAdmin":true} let e = Event::OrderPlaced { order_id: 42, total: 99.95 }; println!("{}", serde_json::to_string(&e).unwrap()); // {"type":"OrderPlaced","data":{"order_id":42,"total":99.95}} }