Function etwin_serde_tools::deserialize_explicit_option[][src]

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()) }
);