Function etwin_serde_tools::deserialize_explicit_option
source · pub fn deserialize_explicit_option<'de, T, D>(
deserializer: D
) -> Result<Option<T>, D::Error>where
T: Deserialize<'de>,
D: Deserializer<'de>,
Expand description
Deserializes an optional field that can’t be missing.
The field must always be defined, either with a value or explicitly unset (e.g. with null
).
Use this to prevent undefined
from being deserialized as None
when parsing JSON.
use serde::{Deserialize, Serialize};
use etwin_serde_tools::deserialize_explicit_option;
#[derive(Serialize, Deserialize)]
#[derive(Debug, PartialEq, Eq)]
struct User {
id: u32,
#[serde(deserialize_with = "deserialize_explicit_option")]
username: Option<String>,
}
assert!(serde_json::from_str::<User>(r#"{"id":1}"#).is_err());
assert_eq!(
serde_json::from_str::<User>(r#"{"id":1,"username":null}"#).unwrap(),
User { id: 1, username: None }
);
assert_eq!(
serde_json::from_str::<User>(r#"{"id":1,"username":"demurgos"}"#).unwrap(),
User { id: 1, username: Some("demurgos".to_string()) }
);