@@ -311,23 +311,32 @@ macro_rules! deserialize_signed {
311311
312312macro_rules! deserialize_fromstr {
313313 ( $self: ident, $visitor: ident, $typ: ident, $visit_fn: ident, $pattern: expr) => { {
314- let start = $self. index;
315- while $self. peek( ) . is_some( ) {
316- let c = $self. peek( ) . unwrap( ) ;
317- if $pattern. iter( ) . find( |&&d| d == c) . is_some( ) {
314+ match $self. parse_whitespace( ) . ok_or( Error :: EofWhileParsingValue ) ? {
315+ b'n' => {
318316 $self. eat_char( ) ;
319- } else {
320- break ;
317+ $self . parse_ident ( b"ull" ) ? ;
318+ $visitor . $visit_fn ( $typ :: NAN )
321319 }
322- }
320+ _ => {
321+ let start = $self. index;
322+ while $self. peek( ) . is_some( ) {
323+ let c = $self. peek( ) . unwrap( ) ;
324+ if $pattern. iter( ) . find( |&&d| d == c) . is_some( ) {
325+ $self. eat_char( ) ;
326+ } else {
327+ break ;
328+ }
329+ }
323330
324- // Note(unsafe): We already checked that it only contains ascii. This is only true if the
325- // caller has guaranteed that `pattern` contains only ascii characters.
326- let s = unsafe { str :: from_utf8_unchecked( & $self. slice[ start..$self. index] ) } ;
331+ // Note(unsafe): We already checked that it only contains ascii. This is only true if the
332+ // caller has guaranteed that `pattern` contains only ascii characters.
333+ let s = unsafe { str :: from_utf8_unchecked( & $self. slice[ start..$self. index] ) } ;
327334
328- let v = $typ:: from_str( s) . or( Err ( Error :: InvalidNumber ) ) ?;
335+ let v = $typ:: from_str( s) . or( Err ( Error :: InvalidNumber ) ) ?;
329336
330- $visitor. $visit_fn( v)
337+ $visitor. $visit_fn( v)
338+ }
339+ }
331340 } } ;
332341}
333342
@@ -423,15 +432,13 @@ impl<'a, 'de> de::Deserializer<'de> for &'a mut Deserializer<'de> {
423432 where
424433 V : Visitor < ' de > ,
425434 {
426- self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ?;
427435 deserialize_fromstr ! ( self , visitor, f32 , visit_f32, b"0123456789+-.eE" )
428436 }
429437
430438 fn deserialize_f64 < V > ( self , visitor : V ) -> Result < V :: Value >
431439 where
432440 V : Visitor < ' de > ,
433441 {
434- self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ?;
435442 deserialize_fromstr ! ( self , visitor, f64 , visit_f64, b"0123456789+-.eE" )
436443 }
437444
@@ -941,11 +948,17 @@ mod tests {
941948 ) )
942949 ) ;
943950
951+ // NaNs will always compare unequal.
952+ let ( r, n) : ( Temperature , usize ) = crate :: from_str ( r#"{ "temperature": null }"# ) . unwrap ( ) ;
953+ assert ! ( r. temperature. is_nan( ) ) ;
954+ assert_eq ! ( n, 23 ) ;
955+
944956 assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": 1e1e1 }"# ) . is_err( ) ) ;
945957 assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": -2-2 }"# ) . is_err( ) ) ;
946958 assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": 1 1 }"# ) . is_err( ) ) ;
947959 assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": 0.0. }"# ) . is_err( ) ) ;
948960 assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": ä }"# ) . is_err( ) ) ;
961+ assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": None }"# ) . is_err( ) ) ;
949962 }
950963
951964 #[ test]
0 commit comments