diff --git a/vortex-dtype/src/serde/mod.rs b/vortex-dtype/src/serde/mod.rs index 54c14957ab6..0046cc7448a 100644 --- a/vortex-dtype/src/serde/mod.rs +++ b/vortex-dtype/src/serde/mod.rs @@ -126,4 +126,31 @@ mod test { .unwrap(); assert_eq!(struct_dtype, deserialized); } + + #[test] + fn test_serde_struct_fields_from_json_value() { + use serde::de::IntoDeserializer; + + use crate::StructFields; + + let fields = StructFields::from_iter([ + ("name", DType::Utf8(Nullability::NonNullable)), + ("age", DType::Primitive(PType::I32, Nullability::Nullable)), + ]); + + let value: serde_json::Value = serde_json::to_value(&fields).unwrap(); + + let json_str = value.to_string(); + let mut deserializer = serde_json::Deserializer::from_str(&json_str); + let from_str: StructFields = DTypeSerde::::new(&SESSION) + .deserialize(&mut deserializer) + .unwrap(); + assert_eq!(fields, from_str); + + let deserializer = value.into_deserializer(); + let from_value: StructFields = DTypeSerde::::new(&SESSION) + .deserialize(deserializer) + .unwrap(); + assert_eq!(fields, from_value); + } } diff --git a/vortex-dtype/src/serde/serde.rs b/vortex-dtype/src/serde/serde.rs index cef9ed3bc56..02fcac183c2 100644 --- a/vortex-dtype/src/serde/serde.rs +++ b/vortex-dtype/src/serde/serde.rs @@ -1,6 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: Copyright the Vortex contributors +use std::borrow::Cow; use std::fmt; use std::fmt::Formatter; use std::marker::PhantomData; @@ -172,8 +173,8 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, DType> { where A: EnumAccess<'de>, { - let (variant, access) = data.variant::<&str>()?; - match variant { + let (variant, access) = data.variant::>()?; + match variant.as_ref() { "Null" => { access.unit_variant()?; Ok(DType::Null) @@ -216,7 +217,7 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, DType> { .newtype_variant_seed(DTypeSerde::::new(self.session))?; Ok(DType::Extension(ext)) } - _ => Err(de::Error::unknown_variant(variant, VARIANTS)), + _ => Err(de::Error::unknown_variant(&variant, VARIANTS)), } } } @@ -404,8 +405,8 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, StructFields> { let mut names: Option = None; let mut dtypes: Option> = None; - while let Some(key) = map.next_key::<&str>()? { - match key { + while let Some(key) = map.next_key::>()? { + match key.as_ref() { "names" => { if names.is_some() { return Err(de::Error::duplicate_field("names")); @@ -536,8 +537,8 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, ExtDTypeRef> { let mut storage_dtype: Option = None; let mut metadata: Option> = None; - while let Some(key) = map.next_key::<&str>()? { - match key { + while let Some(key) = map.next_key::>()? { + match key.as_ref() { "id" => { if id.is_some() { return Err(de::Error::duplicate_field("id"));