Module serde_with::rust::unwrap_or_skip
source · [−]Expand description
Serialize inner value if Some
(T)
. If None
, serialize the unit struct ()
.
When used in conjunction with skip_serializing_if = "Option::is_none"
and
default
, you can build an optional value by skipping if it is None
, or serializing its
inner value if Some
(T)
.
Not all serialization formats easily support optional values.
While JSON uses the Option
type to represent optional values and only serializes the inner
part of the Some
()
, other serialization formats, such as RON, choose to serialize the
Some
around a value.
This helper helps building a truly optional value for such serializers.
Example
#[derive(Deserialize, Serialize)]
struct Doc {
mandatory: usize,
#[serde(
default, // <- important for deserialization
skip_serializing_if = "Option::is_none", // <- important for serialization
with = "::serde_with::rust::unwrap_or_skip",
)]
optional: Option<usize>,
}
// Transparently add/remove Some() wrapper
let s = r#"(
mandatory: 1,
optional: 2,
)"#;
let v = Doc {
mandatory: 1,
optional: Some(2),
};
assert_eq!(v, ron::de::from_str(s).unwrap());
assert_eq!(s, ron::ser::to_string_pretty(&v, pretty_config).unwrap());
// Missing values are deserialized as `None`
// while `None` values are skipped during serialization.
let s = r#"(
mandatory: 1,
)"#;
let v = Doc {
mandatory: 1,
optional: None,
};
assert_eq!(v, ron::de::from_str(s).unwrap());
assert_eq!(s, ron::ser::to_string_pretty(&v, pretty_config).unwrap());
Functions
Deserialize value wrapped in Some(T)
Serialize value if Some(T), unit struct if None