diff --git a/src/io/json/read/deserialize.rs b/src/io/json/read/deserialize.rs index 18c7499861b..03fb257a276 100644 --- a/src/io/json/read/deserialize.rs +++ b/src/io/json/read/deserialize.rs @@ -25,10 +25,7 @@ use serde_json::Value; use crate::types::NaturalDataType; use crate::{ - array::{ - Array, BooleanArray, DictionaryArray, DictionaryKey, ListArray, NullArray, Offset, - PrimitiveArray, StructArray, Utf8Array, - }, + array::*, bitmap::MutableBitmap, buffer::MutableBuffer, datatypes::{DataType, IntervalUnit}, @@ -90,6 +87,14 @@ fn read_primitive( PrimitiveArray::from_trusted_len_iter(iter).to(data_type) } +fn read_binary(rows: &[&Value]) -> BinaryArray { + let iter = rows.iter().map(|row| match row { + Value::String(v) => Some(v.as_bytes()), + _ => None, + }); + BinaryArray::from_trusted_len_iter(iter) +} + fn read_boolean(rows: &[&Value]) -> BooleanArray { let iter = rows.iter().map(|row| match row { Value::Bool(v) => Some(v), @@ -236,9 +241,8 @@ pub fn read(rows: &[&Value], data_type: DataType) -> Arc { DataType::LargeUtf8 => Arc::new(read_utf8::(rows)), DataType::List(_) => Arc::new(read_list::(rows, data_type)), DataType::LargeList(_) => Arc::new(read_list::(rows, data_type)), - // unsupported - //DataType::Binary => Box::new(BinaryArray::::new_empty()), - //DataType::LargeBinary => Box::new(BinaryArray::::new_empty()), + DataType::Binary => Arc::new(read_binary::(rows)), + DataType::LargeBinary => Arc::new(read_binary::(rows)), DataType::Struct(_) => Arc::new(read_struct(rows, data_type)), DataType::Dictionary(key_type, _) => match key_type.as_ref() { DataType::Int8 => Arc::new(read_dictionary::(rows, data_type)), diff --git a/tests/it/io/json/mod.rs b/tests/it/io/json/mod.rs index 37810e9ec39..b8bc9a5f7be 100644 --- a/tests/it/io/json/mod.rs +++ b/tests/it/io/json/mod.rs @@ -167,8 +167,8 @@ fn case_basics() -> (String, Schema, Vec>) { } fn case_basics_schema() -> (String, Schema, Vec>) { - let data = r#"{"a":1, "b":2.0, "c":false, "d":"4"} - {"a":10, "b":-3.5, "c":true, "d":null} + let data = r#"{"a":1, "b":2.0, "c":false, "d":"4", "e":"4"} + {"a":10, "b":-3.5, "c":true, "d":null, "e":"text"} {"a":100000000, "b":0.6, "d":"text"}"# .to_string(); let schema = Schema::new(vec![ @@ -176,11 +176,17 @@ fn case_basics_schema() -> (String, Schema, Vec>) { Field::new("b", DataType::Float32, true), Field::new("c", DataType::Boolean, true), // note how "d" is not here + Field::new("e", DataType::Binary, true), ]); let columns = vec![ Box::new(UInt32Array::from_slice(&[1, 10, 100000000])) as Box, Box::new(Float32Array::from_slice(&[2.0, -3.5, 0.6])), Box::new(BooleanArray::from(&[Some(false), Some(true), None])), + Box::new(BinaryArray::::from(&[ + Some(b"4".as_ref()), + Some(b"text".as_ref()), + None, + ])), ]; (data, schema, columns) }