From 6d9682f4e6e5d47afaa05f8a35a230bf5e07a334 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Sun, 5 Feb 2023 01:07:13 +0900 Subject: [PATCH] Fix deserialize_skip_error function (#24) https://github.com/serde-rs/serde/issues/1726#issuecomment-577425541 --- src/deser/helpers.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/deser/helpers.rs b/src/deser/helpers.rs index 67641dd..f5d4cf1 100644 --- a/src/deser/helpers.rs +++ b/src/deser/helpers.rs @@ -58,9 +58,26 @@ where T: Deserialize<'de> + Default, D: Deserializer<'de>, { - let result = Deserialize::deserialize(deserializer); - Ok(match result { - Ok(o) => o, - Err(_) => Default::default(), - }) + let value = serde_json::Value::deserialize(deserializer)?; + let inner = T::deserialize(value).unwrap_or_default(); + Ok(inner) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_deserialize_skip_error() { + #[derive(Debug, Deserialize)] + pub struct MyData { + #[serde(deserialize_with = "deserialize_skip_error")] + pub data: Option, + } + // data has type object + let _: MyData = serde_json::from_str(r#"{ "data": {} }"#).unwrap(); + + // data has type array + let _: MyData = serde_json::from_str(r#"{"data": []}"#).unwrap(); + } }