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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:56