使用Rust解析Json文件

高效、安全的Json解析

使用Rust解析Json文件

假如你需要处理一个简单的Json文件,内容为宠物的名字与出生日期

{
    "name": "Shawn",
    "birthday": 2022
}

可以借助Serde Json来实现!

解析简单的Json文件

使用Cargo创建新项目

cargo new json-demo

然后引入Serde Json以及依赖项

cargo add serde-json
cargo add serde --features=derive

Serde Json支持将Json内容解析为Rust的数据类型struct ,这样可以充分利用Rust语言的类型推断等特性,推荐使用这种方式。

src/main.rs 中,定义一个与Json文件结构相同的 struct

use serde::Deserialize;

#[derive(Deserialize)]
struct Pet {
    name: String,
    birthday: i64,
}

注意 #[derive(Deserialize)] 为Serde提供的trait。

然后就可以在main函数中实现文件解析了

use serde::Deserialize;

use std::fs::File;
use std::io::prelude::*;

#[derive(Deserialize)]
struct Pet {
    name: String,
    birthday: i64,
}

fn main() {
    let mut file = File::open("sample.json").unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
    let cat: Pet = serde_json::from_str(&contents).unwrap();
    println!("{} the cat was born in {}.", cat.name, cat.birthday);
}
💡
这个简单例子使用了unwrap。实际情况中请妥善处理异常。

最终的输出为

Shawn the cat was born in 2022.

这是一个非常简单的例子。实际状况中,Json文件多存在多层级的嵌套结构。这种情况该如何处理?