use serde::de::{ Deserialize, Deserializer, EnumAccess, IgnoredAny, MapAccess, VariantAccess, Visitor, }; use serde_json::json; use std::fmt; #[derive(Debug)] pub enum Enum { Variant { x: u8 }, } impl<'de> Deserialize<'de> for Enum { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct EnumVisitor; impl<'de> Visitor<'de> for EnumVisitor { type Value = Enum; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("enum Enum") } fn visit_enum(self, data: A) -> Result where A: EnumAccess<'de>, { let (IgnoredAny, variant) = data.variant()?; variant.struct_variant(&["x"], self) } fn visit_map(self, mut data: A) -> Result where A: MapAccess<'de>, { let mut x = 0; if let Some((IgnoredAny, value)) = data.next_entry()? { x = value; } Ok(Enum::Variant { x }) } } deserializer.deserialize_enum("Enum", &["Variant"], EnumVisitor) } } #[test] fn test() { let s = r#" {"Variant":{"x":0,"y":0}} "#; assert!(serde_json::from_str::(s).is_err()); let j = json!({"Variant":{"x":0,"y":0}}); assert!(serde_json::from_value::(j).is_err()); }