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

如何在Rust中将指定JSON的data键转换为Polars DataFrame

在Rust中读取特定JSON结构并转换为Polars DataFrame

你的JSON文件结构中,data字段是一组包含列名、数据数组和类型的对象,直接使用Polars的JsonReader会将整个data解析为单个列表列,无法得到预期的表格结构。以下是实现正确转换的步骤和代码:

依赖准备

在Cargo.toml中添加所需依赖:

[dependencies]
polars = { version = "0.35", features = ["json", "serde_json"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

完整实现代码

use polars::prelude::*;
use serde::Deserialize;
use std::fs::File;

// 定义与JSON结构匹配的Rust结构体
#[derive(Debug, Deserialize)]
struct DataItem {
    #[serde(rename = "dataItemName")]
    data_item_name: String,
    result: serde_json::Value,
    #[serde(rename = "dataType")]
    data_type: String,
    error: u32,
}

#[derive(Debug, Deserialize)]
struct JsonData {
    data: Vec<DataItem>,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 读取并解析JSON文件
    let file = File::open("data/test_merged.json")?;
    let json_data: JsonData = serde_json::from_reader(file)?;

    let mut series = Vec::new();

    for item in json_data.data {
        // 根据dataType转换数据为对应Polars Series
        let col = match item.data_type.as_str() {
            "STRING" => {
                let values = item.result.as_array()
                    .ok_or("Invalid string array format")?
                    .iter()
                    .map(|v| v.as_str().ok_or("Invalid string value"))
                    .collect::<Result<Vec<&str>, _>>()?;
                Series::new(&item.data_item_name, values)
            }
            "DOUBLE" => {
                let values = item.result.as_array()
                    .ok_or("Invalid numeric array format")?
                    .iter()
                    .map(|v| v.as_f64().ok_or("Invalid numeric value"))
                    .collect::<Result<Vec<f64>, _>>()?;
                Series::new(&item.data_item_name, values)
            }
            _ => return Err(format!("Unsupported data type: {}", item.data_type).into()),
        };
        series.push(col);
    }

    // 构建DataFrame并输出
    let df = DataFrame::new(series)?;
    println!("{}", df);

    Ok(())
}

代码说明

  1. 结构体定义:通过serde的Deserialize trait和字段重命名,匹配JSON中的驼峰命名字段
  2. JSON解析:使用serde_json将文件内容解析为Rust结构体,便于逐个处理数据项
  3. 数据类型转换:根据dataType字段将result数组转换为对应类型的Polars Series,确保数据类型与预期一致
  4. DataFrame构建:将所有Series组合成标准表格结构的DataFrame

预期输出

运行代码后会得到如下格式的DataFrame:

shape: (3, 5)
┌────────┬────────┬─────────────────────┬────────┬────────┐
│ TICKER ┆ SALES  ┆ CNAME               ┆ PRICE  ┆ ASSETS │
│ ---    ┆ ---    ┆ ---                 ┆ ---    ┆ ---    │
│ str    ┆ f64    ┆ str                 ┆ f64    ┆ f64    │
╞════════╪════════╪═════════════════════╪════════╪════════╡
│ AAPL   ┆ 259968 ┆ Apple Inc.          ┆ 115.98 ┆ 338516 │
│ MSFT   ┆ 143015 ┆ Microsoft Corporation ┆ 214.22 ┆ 301311 │
│ TSLA   ┆ 24578  ┆ Tesla Inc           ┆ 430.83 ┆ 34309  │
└────────┴────────┴─────────────────────┴────────┴────────┘

内容的提问来源于stack exchange,提问作者Trevor Seibert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:04:55