如何在Rust中将Polars DataFrame序列化为正确格式的JSON?
如何将Polars DataFrame序列化为预期格式的JSON?
直接使用serde_json::to_value序列化Polars DataFrame会得到二进制数组格式的输出,这是因为Polars默认的serde实现是为二进制IPC场景设计的,并非JSON友好结构。要得到你预期的行对象数组格式JSON,可以用以下两种方法:
方法一:使用Polars内置的write_json方法
Polars提供了直接导出JSON的API,可以将DataFrame写入到字符串或文件中,输出就是你想要的格式:
use polars::prelude::*; use std::io::Cursor; fn main() { let df = df! { "a" => [1,2,3,4,5], }.unwrap(); // 通过Cursor将JSON写入内存缓冲区,再转换为字符串 let mut cursor = Cursor::new(Vec::new()); df.write_json(&mut cursor).unwrap(); let json_str = String::from_utf8(cursor.into_inner()).unwrap(); println!("{}", json_str); }
运行后会输出:
[{"a":1},{"a":2},{"a":3},{"a":4},{"a":5}]
方法二:手动转换为serde_json::Value
如果需要得到serde_json::Value类型而非字符串,可以遍历DataFrame的行,手动构建JSON对象数组:
use polars::prelude::*; use serde_json::Value; fn main() { let df = df! { "a" => [1,2,3,4,5], }.unwrap(); // 遍历每一行,构建对应的JSON对象 let json_values: Vec<Value> = df.iter_rows() .map(|row| { let mut obj = serde_json::Map::new(); // 提取字段值并转换为JSON类型 obj.insert("a".to_string(), Value::Number(row[0].try_extract::<i64>().unwrap().into())); Value::Object(obj) }) .collect(); let df_json = Value::Array(json_values); // 格式化输出JSON println!("{}", serde_json::to_string_pretty(&df_json).unwrap()); }
支持多列的通用写法
如果DataFrame包含多个列,可以通过列名动态构建JSON对象,避免硬编码:
use polars::prelude::*; use serde_json::Value; fn main() { let df = df! { "a" => [1,2,3,4,5], "b" => ["x", "y", "z", "w", "v"] }.unwrap(); let columns = df.columns().to_vec(); let json_values: Vec<Value> = df.iter_rows() .map(|row| { let mut obj = serde_json::Map::new(); // 遍历列名和对应的值,转换为JSON类型 for (col_name, val) in columns.iter().zip(row.iter()) { let json_val = match val { AnyValue::Int64(i) => Value::Number((*i).into()), AnyValue::Utf8(s) => Value::String(s.to_string()), // 根据你的数据类型补充其他匹配分支,比如Float64、Boolean等 _ => Value::Null, }; obj.insert(col_name.to_string(), json_val); } Value::Object(obj) }) .collect(); println!("{}", serde_json::to_string_pretty(&Value::Array(json_values)).unwrap()); }
内容的提问来源于stack exchange,提问作者Nyssance
相关产品推荐
相关产品推荐

