面试题答案
一键面试use serde::{Deserialize, Serialize};
use serde_json;
// 定义Address结构体
#[derive(Serialize, Deserialize)]
struct Address {
street: String,
city: String,
zip: u32,
}
// 定义包含Address和hobbies的主结构体
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
age: u32,
address: Address,
hobbies: Vec<String>,
}
fn main() {
// 定义JSON字符串
let json_str = r#"{"name":"John","age":30,"address":{"street":"123 Main St","city":"Anytown","zip":12345},"hobbies":["reading","swimming"]}"#;
// 反序列化JSON字符串为Person结构体实例
let person: Person = serde_json::from_str(json_str).expect("反序列化失败");
// 打印反序列化后的结构体
println!("反序列化后的结构体: {:?}", person);
// 将Person结构体实例序列化为JSON字符串
let serialized = serde_json::to_string(&person).expect("序列化失败");
// 打印序列化后的JSON字符串
println!("序列化后的JSON字符串: {}", serialized);
}
代码解释
-
引入serde库:
use serde::{Deserialize, Serialize};
引入serde
库中的Deserialize
和Serialize
trait,这两个trait分别用于反序列化和序列化。use serde_json;
引入serde_json
库,用于处理JSON格式数据。
-
定义结构体:
Address
结构体:包含street
(字符串类型)、city
(字符串类型)和zip
(无符号32位整数类型)三个字段,并为其派生Serialize
和Deserialize
trait。Person
结构体:包含name
(字符串类型)、age
(无符号32位整数类型)、address
(Address
类型)和hobbies
(字符串类型的Vec
)四个字段,并为其派生Serialize
和Deserialize
trait。
-
主函数:
- 反序列化:
- 使用
serde_json::from_str
函数将给定的JSON字符串反序列化为Person
结构体实例。如果反序列化失败,使用expect
函数打印错误信息。
- 使用
- 序列化:
- 使用
serde_json::to_string
函数将Person
结构体实例序列化为JSON字符串。如果序列化失败,使用expect
函数打印错误信息。最后打印反序列化后的结构体和序列化后的JSON字符串。
- 使用
- 反序列化: