如何在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(()) }
代码说明
- 结构体定义:通过
serde的Deserializetrait和字段重命名,匹配JSON中的驼峰命名字段 - JSON解析:使用
serde_json将文件内容解析为Rust结构体,便于逐个处理数据项 - 数据类型转换:根据
dataType字段将result数组转换为对应类型的Polars Series,确保数据类型与预期一致 - 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
相关产品推荐
相关产品推荐

