使用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"