Published
This took me a few attempts to get right, so here's a note to self. In hindsight, the documentation is pretty clear, but there are no examples, so I overlooked it.
If you have a struct with an enum field and you want to serialize
the enum to a string using Serde and deriving Serialize, you
can use the rename_all or rename attribute macros.
rename_all
If your enum follows one of the conventions implemented in Serde,
your best bet is to use the rename_all attribute macro to tell
Serde to use a specific naming convention for serializing the
enum variants.
#[derive(Serialize)]#[serde(rename_all = "kebab-case")]enum FlightLength { ShortHaul, MidHaul, LongHaul,}
#[derive(Serialize)]struct Flight { length: FlightLength,}
let f = Flight { length: FlightLength::ShortHaul,};
let j = serde_json::to_string(&address)?;assert_eq!(j, r#"{"length":"short-haul"}"#);Link to a playground that compiles and run.
This is applicable for: "lowercase", "UPPERCASE",
"PascalCase", "camelCase", "snake_case",
"SCREAMING_SNAKE_CASE", "kebab-case",
"SCREAMING-KEBAB-CASE".
rename
If your enum doesn't follow a convention, you can instead rename each variant.
#[derive(Serialize)]enum FlightLength { #[serde(rename = "SHORT HAUL")] ShortHaul, #[serde(rename = "MID HAUL")] MidHaul, #[serde(rename = "LONG HAUL")] LongHaul,}
#[derive(Serialize)]struct Flight { length: FlightLength,}
let f = Flight { length: FlightLength::ShortHaul,};
let j = serde_json::to_string(&address)?;assert_eq!(j, r#"{"length":"SHORT HAUL"}"#);