diff --git a/serde2/src/json/de.rs b/serde2/src/json/de.rs index 26c2180e..ae9b8445 100644 --- a/serde2/src/json/de.rs +++ b/serde2/src/json/de.rs @@ -392,6 +392,24 @@ impl> de::Deserializer for Deserializer { { self.parse_value(visitor) } + + #[inline] + fn visit_option(&mut self, mut visitor: V) -> Result + where V: de::Visitor, + { + self.parse_whitespace(); + + if self.eof() { + return Err(self.error(ErrorCode::EOFWhileParsingValue)); + } + + if self.ch_is(b'n') { + try!(self.parse_ident(b"ull")); + visitor.visit_none() + } else { + visitor.visit_some(self) + } + } } struct SeqVisitor<'a, Iter: 'a> { diff --git a/serde2/src/json/value.rs b/serde2/src/json/value.rs index a6e92edc..6ff77d88 100644 --- a/serde2/src/json/value.rs +++ b/serde2/src/json/value.rs @@ -78,6 +78,18 @@ impl de::Deserialize for Value { Ok(Value::String(value)) } + #[inline] + fn visit_none(&mut self) -> Result { + Ok(Value::Null) + } + + #[inline] + fn visit_some(&mut self, deserializer: &mut D) -> Result + where D: de::Deserializer, + { + de::Deserialize::deserialize(deserializer) + } + #[inline] fn visit_seq(&mut self, visitor: V) -> Result where V: de::SeqVisitor, diff --git a/serde2/tests/test_json.rs b/serde2/tests/test_json.rs index e5798911..f9c8d4d9 100644 --- a/serde2/tests/test_json.rs +++ b/serde2/tests/test_json.rs @@ -691,11 +691,10 @@ fn test_parse_struct() { ]); } -/* #[test] fn test_parse_option() { test_parse_ok(&[ - ("null", None), + ("null", None::), ("\"jodhpurs\"", Some("jodhpurs".to_string())), ]); @@ -706,21 +705,18 @@ fn test_parse_option() { x: Option, } + /* let value: Foo = from_str("{}").unwrap(); assert_eq!(value, Foo { x: None }); + */ - let value: Foo = from_str("{ \"x\": 5 }").unwrap(); - assert_eq!(value, Foo { x: Some(5) }); -} - -#[test] -fn test_json_deserialize_option() { - test_json_deserialize_ok(&[ - None, - Some("jodhpurs".to_string()), + test_parse_ok(&[ + ("{\"x\": null}", Foo { x: None }), + ("{\"x\": 5}", Foo { x: Some(5) }), ]); } +/* #[test] fn test_parse_enum() { test_parse_ok(&[