JSON在Rust中入门:数据解析与序列化

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

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

开始课程

JSON在Rust中的入门介绍



JSON(JavaScript Object Notation)是Web开发、配置文件及API中最流行的数据交换格式之一。如果你正在学习Rust并希望掌握高效处理JSON的方法,这篇文章正是为你准备的。我们将介绍核心库、解析与序列化的原理,并通过实际代码示例进行讲解。



在Rust生态系统中,JSON处理主要围绕serde库构建——这是一个强大的数据序列化与反序列化框架。配合serde_json使用,可以轻松实现数据结构与JSON之间的相互转换。让我们来了解它的工作原理。



安装与配置依赖



首先,创建一个新项目并在Cargo.toml文件中添加必要的依赖:



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


serde库提供了#[derive(Serialize, Deserialize)]宏,可以自动为你的结构体实现所需的trait。serde_json则负责直接处理JSON格式。



解析JSON:从字符串到结构体



假设我们有一个包含用户信息的JSON字符串。我们希望将其转换为Rust的类型化结构体。具体做法如下:



use serde::{Deserialize, Serialize};

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

fn main() { let json_data = r#" { "name": "阿列克谢", "age": 28, "email": "alex@example.com", "is_active": true } "#;

// 将JSON解析为结构体 let user: User = serde_json::from_str(json_data).expect("JSON解析错误"); println!("用户: {:?}", user); println!("姓名: {}", user.name); println!("年龄: {}", user.age);}


请注意属性#[derive(Debug, Deserialize, Serialize)]。Debug允许在控制台输出结构体,而Deserialize和Serialize则支持数据与JSON之间的相互转换。



处理嵌套对象



JSON经常包含嵌套对象。以下是一个包含用户地址的示例:



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

#[derive(Debug, Deserialize, Serialize)]struct User { name: String, age: u32, address: Address,}

fn main() { let json_data = r#" { "name": "玛丽亚", "age": 32, "address": { "city": "莫斯科", "street": "特维尔大街15号", "zip_code": "101000" } } "#;

let user: User = serde_json::from_str(json_data).unwrap(); println!("城市: {}", user.address.city);}


处理JSON数组



JSON中的数组会转换为Rust的Vec或其他集合类型:



use serde::Deserialize;

#[derive(Debug, Deserialize)]struct Product { id: u32, name: String, price: f64,}

fn main() { let json_array = r#" [ {"id": 1, "name": "笔记本电脑", "price": 75000.50}, {"id": 2, "name": "鼠标", "price": 1500.00}, {"id": 3, "name": "键盘", "price": 3500.00} ] "#;

let products: Vec<Product> = serde_json::from_str(json_array).unwrap(); for product in &products { println!("{}: {} 卢布", product.name, product.price); }}


序列化:从结构体到JSON



反向过程——将Rust结构体转换为JSON字符串。这被称为序列化。

博客

书籍推荐