diff --git a/src/io/json/write/serialize.rs b/src/io/json/write/serialize.rs index 3b1f9e087b5..fb90c17ad0f 100644 --- a/src/io/json/write/serialize.rs +++ b/src/io/json/write/serialize.rs @@ -43,6 +43,29 @@ fn primitive_serializer<'a, T: NativeType + ToLexical>( )) } +fn float_serializer<'a, T>( + array: &'a PrimitiveArray, +) -> Box + 'a + Send + Sync> +where + T: num_traits::Float + NativeType + ToLexical, +{ + Box::new(BufStreamingIterator::new( + array.iter(), + |x, buf| { + if let Some(x) = x { + if T::is_nan(*x) { + buf.extend(b"null") + } else { + lexical_to_bytes_mut(*x, buf) + } + } else { + buf.extend(b"null") + } + }, + vec![], + )) +} + fn utf8_serializer<'a, O: Offset>( array: &'a Utf8Array, ) -> Box + 'a + Send + Sync> { @@ -196,8 +219,8 @@ pub(crate) fn new_serializer<'a>( DataType::UInt16 => primitive_serializer::(array.as_any().downcast_ref().unwrap()), DataType::UInt32 => primitive_serializer::(array.as_any().downcast_ref().unwrap()), DataType::UInt64 => primitive_serializer::(array.as_any().downcast_ref().unwrap()), - DataType::Float32 => primitive_serializer::(array.as_any().downcast_ref().unwrap()), - DataType::Float64 => primitive_serializer::(array.as_any().downcast_ref().unwrap()), + DataType::Float32 => float_serializer::(array.as_any().downcast_ref().unwrap()), + DataType::Float64 => float_serializer::(array.as_any().downcast_ref().unwrap()), DataType::Utf8 => utf8_serializer::(array.as_any().downcast_ref().unwrap()), DataType::LargeUtf8 => utf8_serializer::(array.as_any().downcast_ref().unwrap()), DataType::Struct(_) => struct_serializer(array.as_any().downcast_ref().unwrap()), diff --git a/tests/it/io/json/write.rs b/tests/it/io/json/write.rs index 69e4bfa9d94..d79a5310f06 100644 --- a/tests/it/io/json/write.rs +++ b/tests/it/io/json/write.rs @@ -28,6 +28,24 @@ fn int32() -> Result<()> { test!(array, expected) } +#[test] +fn f32() -> Result<()> { + let array = Float32Array::from([Some(1.5), Some(2.5), Some(f32::NAN), None, Some(5.5)]); + + let expected = r#"[1.5,2.5,null,null,5.5]"#; + + test!(array, expected) +} + +#[test] +fn f64() -> Result<()> { + let array = Float64Array::from([Some(1.5), Some(2.5), Some(f64::NAN), None, Some(5.5)]); + + let expected = r#"[1.5,2.5,null,null,5.5]"#; + + test!(array, expected) +} + #[test] fn utf8() -> Result<()> { let array = Utf8Array::::from(&vec![Some("a"), Some("b"), Some("c"), Some("d"), None]);