diff --git a/serde_macros/src/lib.rs b/serde_macros/src/lib.rs index fd214f58..eac39999 100644 --- a/serde_macros/src/lib.rs +++ b/serde_macros/src/lib.rs @@ -389,6 +389,7 @@ fn deserialize_struct_from_map( $name = Some( try!(::serde::de::Deserializable::deserialize($deserializer)) ); + continue; }) }) .collect(); @@ -465,13 +466,11 @@ fn deserialize_struct_from_map( match key { $key_arms - _ => { - // Ignore unknown fields. - let _: ::serde::de::IgnoreTokens = - try!(Deserializable::deserialize($deserializer)); - } + _ => { } } } + + try!($deserializer.ignore_field(token)) } match $fields_tuple { diff --git a/src/de.rs b/src/de.rs index 88f1df60..cb9cda82 100644 --- a/src/de.rs +++ b/src/de.rs @@ -193,6 +193,12 @@ pub trait Deserializer: Iterator> { /// named `field`. fn missing_field_error(&mut self, field: &'static str) -> E; + /// Called when a deserializable has decided to not consume this token. + fn ignore_field(&mut self, _token: Token) -> Result<(), E> { + let _: IgnoreTokens = try!(Deserializable::deserialize(self)); + Ok(()) + } + #[inline] fn expect_token(&mut self) -> Result { match self.next() {