core_json_traits/
option.rs

1use crate::{Read, Stack, JsonError, Type, Value, JsonDeserialize, JsonSerialize};
2
3impl<T: JsonDeserialize> JsonDeserialize for Option<T> {
4  /// This will accept `null` as a representation of `None`.
5  fn deserialize<'read, 'parent, B: Read<'read>, S: Stack>(
6    mut value: Value<'read, 'parent, B, S>,
7  ) -> Result<Self, JsonError<'read, B, S>> {
8    if matches!(value.kind()?, Type::Null) {
9      let () = value.to_null()?;
10      return Ok(None);
11    }
12    T::deserialize(value).map(Some)
13  }
14}
15
16impl<T: JsonSerialize> JsonSerialize for Option<T> {
17  /// This will serialize `Some(value)` as `value` and `None` as `null`.
18  fn serialize(&self) -> impl Iterator<Item = char> {
19    self
20      .as_ref()
21      .map(|value| T::serialize(value))
22      .into_iter()
23      .flatten()
24      .chain(self.is_none().then(|| "null".chars()).into_iter().flatten())
25  }
26}