Skip to content

Commit 5f00ec1

Browse files
committed
improve the to_json column to render list arrays as valid json
1 parent d043d1c commit 5f00ec1

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

src/functions.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use anyhow::Result;
22
use chrono::{DateTime, Utc};
33
use chrono_tz::Tz;
44
use datafusion::arrow::array::{
5-
Array, ArrayRef, BinaryArray, BooleanArray, Float64Array, Int64Array, StringArray, StringBuilder, TimestampMicrosecondArray, TimestampNanosecondArray,
5+
Array, ArrayRef, BinaryArray, BooleanArray, Float64Array, Int64Array, ListArray, StringArray, StringBuilder, TimestampMicrosecondArray, TimestampNanosecondArray,
66
};
77
use datafusion::arrow::datatypes::{DataType, TimeUnit};
88
use datafusion::common::{DataFusionError, not_impl_err, ScalarValue};
@@ -549,6 +549,22 @@ fn array_to_json_values(array: &ArrayRef) -> datafusion::error::Result<Vec<JsonV
549549
}
550550
}
551551
}
552+
DataType::List(_) => {
553+
let list_array = array
554+
.as_any()
555+
.downcast_ref::<ListArray>()
556+
.ok_or_else(|| DataFusionError::Execution("Failed to downcast to ListArray".to_string()))?;
557+
558+
for i in 0..list_array.len() {
559+
if list_array.is_null(i) {
560+
values.push(JsonValue::Null);
561+
} else {
562+
let array_ref = list_array.value(i);
563+
let inner_values = array_to_json_values(&array_ref)?;
564+
values.push(JsonValue::Array(inner_values));
565+
}
566+
}
567+
}
552568
_ => {
553569
// For other types, try to convert to string
554570
let string_array = datafusion::arrow::compute::cast(array, &DataType::Utf8)?;

0 commit comments

Comments
 (0)