如何将Polars DataFrame直接序列化为serde_json::Value?
直接将Polars DataFrame转换为serde_json::Value的方法
可以直接实现该转换,无需先序列化为JSON字符串再反序列化,以下是两种高效的实现方式,效果等价于pandas的df.to_dict(orient="records"):
方式1:利用to_structs批量转换(推荐)
这种方式借助Polars内置的结构体转换能力批量处理数据,效率更高:
首先确保Cargo.toml中Polars启用serde和json特性:
polars = { version = "0.37", features = ["serde", "json"] } serde_json = "1.0"
实现代码:
use polars::prelude::*; use serde_json::Value; fn df_to_json_records(df: &DataFrame) -> Result<Value, Box<dyn std::error::Error>> { // 将DataFrame转为包含行结构体的Series let struct_series = df.to_structs(None)?; // 直接序列化结构体Series为JSON数组(serde_json::Value::Array) let json_value = serde_json::to_value(struct_series)?; Ok(json_value) }
方式2:逐行迭代转换
如果需要更灵活的行处理逻辑,可采用逐行遍历并构造JSON对象的方式:
use polars::prelude::*; use serde_json::Value; use std::collections::HashMap; fn df_to_json_records(df: &DataFrame) -> Result<Value, Box<dyn std::error::Error>> { let column_names = df.get_column_names(); let mut records = Vec::new(); for row in df.iter_rows() { let row_map: HashMap<String, Value> = column_names .iter() .zip(row.iter()) .map(|(name, val)| (name.to_string(), val.into())) .collect(); records.push(Value::Object(row_map)); } Ok(Value::Array(records)) }
说明
- 两种方法都直接生成
serde_json::Value::Array类型的结果,每个元素对应DataFrame的一行(JSON对象)。 - 方式1依赖Polars的
serde特性,内部批量处理数据,性能更优;方式2适合需要自定义行转换逻辑的场景。
内容的提问来源于stack exchange,提问作者BallpointBen
相关产品推荐
相关产品推荐

