Home 使用serde解析json
Post
Cancel

使用serde解析json

使用serde解析json

添加依赖

在Cargo.toml文件中添加以下行:

1
2
3
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

Object to json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct User {
    name: String,
    age: u8,
    skill: Vec<String>,
}

fn main() {
    let user = User {
        name: "jiangker".into(),
        age: 18,
        skill: vec!["Java".into(), "Rust".into(), "Dart".into()],
    };

    // 序列化为JSON字符串
    let user_str = serde_json::to_string(&user).unwrap();

    println!("{}", user_str)
}

输出

1
{"name":"jiangker","age":18,"skill":["Java","Rust","Dart"]}

Json to Object

任何正常的json都可以直接解析成serde中定义的枚举

1
2
3
4
5
6
7
8
enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}

示例

1
2
3
4
5
6
7
8
9
10
fn main() {
    // 一个&str类型的JSON数据
    let data: &str = r#"{"name":"jiangker","age":18,"skill":["Java","Rust","Dart"]}"#;

    // 转换成Value
    let user_value: serde_json::Value = serde_json::from_str(data).unwrap();

    println!("{:?}", user_value);
    println!("name: {}", user_value["name"]);
}

输出

1
2
Object {"age": Number(18), "name": String("jiangker"), "skill": Array [String("Java"), String("Rust"), String("Dart")]}
name: "jiangker"

也可以直接解析为对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#[derive(serde::Deserialize, Debug)]
struct User {
    name: String,
    age: u8,
    skill: Vec<String>,
}

fn main() {
    // 一个&str类型的JSON数据
    let data: &str = r#"{"name":"jiangker","age":18,"skill":["Java","Rust","Dart"]}"#;

    // 转换成User对象
    let user: User = serde_json::from_str(data).unwrap();

    println!("{:?}", user);
    println!("name: {}", user.name);
    println!("age: {}", user.age);
    println!("skill: {:?}", user.skill);
}

输出

1
2
3
4
User { name: "jiangker", age: 18, skill: ["Java", "Rust", "Dart"] }
name: jiangker
age: 18
skill: ["Java", "Rust", "Dart"]

json宏

1
2
3
4
5
6
7
8
9
use serde_json::{json, Value};

fn main() {
    // 定义一个json宏
    let user: Value = json!({"name":"jiangker","age":18,"skill":["Java","Rust","Dart"]});

    println!("{:?}", user);
    println!("name: {}", user["name"]);
}

输出

1
2
Object {"age": Number(18), "name": String("jiangker"), "skill": Array [String("Java"), String("Rust"), String("Dart")]}
name: "jiangker"
This post is licensed under CC BY 4.0 by the author.