You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:07:27