Rust 实用处理Json文件避坑 之serde_json

依赖导入

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.json 内容:

{"test":[[1,2,3],[4,5,6]] }

如果数据量比较大,不是很推荐直接用Json,太慢了!!!

你可能感兴趣的:(Rust)