Cargo.toml文件添加:
[dependencies]
serde = "1.0.117"
serde_derive = "1.0.117"
serde_json = "1.0.59"
rs文件 添加:
extern crate serde;
extern crate serde_json;
serde::Value 带来的脏数据问题,使得导入二维数组或者数字类型数据会无法处理
let f = File::open("./test.json").unwrap();
let v: serde_json::Value = serde_json::from_reader(f).unwrap();
println!("{:?}", v["test"]);
运行结果:
Array([Array([Number(1), Number(2), Number(3)]), Array([Number(4), Number(5), Number(6)])])
尝试处理,实用as_array() 将Array转Vec
let f = File::open("./test.json").unwrap();
let v: serde_json::Value = serde_json::from_reader(f).unwrap();
println!("{:?}", v["test"].as_array().unwrap());
运行结果:
[Array([Number(1), Number(2), Number(3)]), Array([Number(4), Number(5), Number(6)])]
解决方法一:
实用as_i64() 将Number转类型
let f = File::open("./test.json").unwrap();
let v: serde_json::Value = serde_json::from_reader(f).unwrap();
let test = v["test"].as_array().unwrap();
let len1 = test.len();
let mut res = vec![];
for i in 0..len1{
res.push(test[i].as_array().unwrap().iter().map(|x| x.as_i64().unwrap()).collect::<Vec<_>>());
}
println!("{:?}",res);
运行结果:
[[1, 2, 3], [4, 5, 6]]
解决方法二:
利用官网的 extern crate serde_derive;重新定义反序列,使用结构体,并在结构体定义相应类型,注意其结构应与json一致!
rs文件添加:
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
#[derive(Debug, Serialize, Deserialize)]
struct Test1 {
test: Vec<Vec<i64>>,
}
fn main(){
let f = File::open("./test.json").unwrap();
let v: Test1 = serde_json::from_reader(f).unwrap();
println!("{:?}",v.test);
}
{"test":[[1,2,3],[4,5,6]] }
如果数据量比较大,不是很推荐直接用Json,太慢了!!!