Rust中的JSON处理:面向教育网站的serde_json库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JSON 处理在 Rust 中:使用 serde_json 的完整指南



JSON(JavaScript Object Notation)是 Web 开发中最流行的数据交换格式之一。在 Rust 中,JSON 处理通过强大的库 serde_json 完成,它是 Serde 生态系统的一部分——一个用于数据序列化和反序列化的框架。在本文中,我们将详细讲解如何在 Rust 中处理 JSON:从安装到包含嵌套结构的复杂示例。



安装与配置



首先,在 Cargo.toml 文件中添加依赖:



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


serde 库提供了宏 #[derive(Serialize, Deserialize)],而 serde_json 负责将数据转换为 JSON 格式以及反向转换。



基本序列化与反序列化



看一个简单示例:创建一个 User 结构体,并学习如何将其转换为 JSON 以及反向转换。



use serde::{Serialize, Deserialize};use serde_json;

#[derive(Debug, Serialize, Deserialize)]struct User { name: String, age: u8, email: String,}

fn main() { // 创建结构体实例 let user = User { name: "Алексей".to_string(), age: 30, email: "alex@example.com".to_string(), };

// 序列化为 JSON 字符串 let json_string = serde_json::to_string(&user).unwrap(); println!("JSON: {}", json_string);

// 从 JSON 反序列化回结构体 let deserialized_user: User = serde_json::from_str(&json_string).unwrap(); println!("反序列化结果: {:?}", deserialized_user);}


执行结果:

JSON: {"name":"Алексей","age":30,"email":"alex@example.com"}反序列化结果: User { name: "Алексей", age: 30, email: "alex@example.com" }


处理嵌套结构



JSON 通常包含嵌套对象和数组。Rust 可以轻松建模此类结构:



#[derive(Debug, Serialize, Deserialize)]struct Address {    city: String,    street: String,    house: u16,}

#[derive(Debug, Serialize, Deserialize)]struct Person { name: String, age: u8, address: Address, hobbies: Vec<String>,}

fn main() { let person = Person { name: "Мария".to_string(), age: 25, address: Address { city: "Москва".to_string(), street: "Тверская".to_string(), house: 10, }, hobbies: vec!["чтение".to_string(), "спорт".to_string()], };

// 带缩进的漂亮 JSON 输出 let pretty_json = serde_json::to_string_pretty(&person).unwrap(); println!("{}", pretty_json);}


输出:

{  "name": "Мария",  "age": 25,  "address": {    "city": "Москва",    "street": "Тверская",    "house": 10  },  "hobbies": [    "чтение",    "спорт"  ]}


错误处理与可选字段



在实际项目中,数据可能不完整。Rust 提供了优雅的方式来处理此类情况:



  • Option<T> — 用于可选字段
  • Result<T, E> — 用于处理解析错误
  • Serde 属性 — 用于配置序列化行为


use serde::{Serialize, Deserialize};use serde_json::Result;

#[derive(Debug, Serialize, Deserialize)]struct Product { name: String, price: f64, #[serde(default)] // 如果字段缺失,使用默认值 description: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] // 如果为 None 则跳过 discount:

推荐