MST

星途 面试题库

面试题:Rust中使用serde实现复杂JSON对象的生成与解析

给定如下复杂JSON结构:{"name":"John","age":30,"address":{"street":"123 Main St","city":"Anytown","zip":12345},"hobbies":["reading","swimming"]}。使用Rust的serde库定义对应的结构体,并实现将该结构体实例序列化为JSON字符串,以及将上述JSON字符串反序列化为结构体实例的功能,写出关键代码和解释。
13.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
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);
}

代码解释

  1. 引入serde库

    • use serde::{Deserialize, Serialize}; 引入serde库中的DeserializeSerialize trait,这两个trait分别用于反序列化和序列化。
    • use serde_json; 引入serde_json库,用于处理JSON格式数据。
  2. 定义结构体

    • Address结构体:包含street(字符串类型)、city(字符串类型)和zip(无符号32位整数类型)三个字段,并为其派生SerializeDeserialize trait。
    • Person结构体:包含name(字符串类型)、age(无符号32位整数类型)、addressAddress类型)和hobbies(字符串类型的Vec)四个字段,并为其派生SerializeDeserialize trait。
  3. 主函数

    • 反序列化
      • 使用serde_json::from_str函数将给定的JSON字符串反序列化为Person结构体实例。如果反序列化失败,使用expect函数打印错误信息。
    • 序列化
      • 使用serde_json::to_string函数将Person结构体实例序列化为JSON字符串。如果序列化失败,使用expect函数打印错误信息。最后打印反序列化后的结构体和序列化后的JSON字符串。