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"}"#);