diff --git a/src/value/de.rs b/src/value/de.rs index 00d95aa..7eb2054 100644 --- a/src/value/de.rs +++ b/src/value/de.rs @@ -511,7 +511,11 @@ impl<'de> serde::Deserializer<'de> for Value { where V: Visitor<'de>, { - self.deserialize_map(visitor) + match self { + Value::Array(v) => visit_array(v, visitor), + Value::Object(v) => visit_object(v, visitor), + _ => Err(self.invalid_type(&visitor)), + } } fn deserialize_identifier( @@ -1044,7 +1048,11 @@ impl<'de> serde::Deserializer<'de> for &'de Value { where V: Visitor<'de>, { - self.deserialize_map(visitor) + match *self { + Value::Array(ref v) => visit_array_ref(v, visitor), + Value::Object(ref v) => visit_object_ref(v, visitor), + _ => Err(self.invalid_type(&visitor)), + } } fn deserialize_identifier( diff --git a/tests/test.rs b/tests/test.rs index bb55577..1fd9b6b 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1179,6 +1179,10 @@ fn test_parse_struct() { ], } ); + + let j = json!([null, 2, []]); + Inner::deserialize(&j).unwrap(); + Inner::deserialize(j).unwrap(); } #[test]