在 Rust 中处理 JSON:解析、序列化及实践示例

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

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

开始课程

Rust中的JSON简介

JSON(JavaScript Object Notation)仍然是Web开发、配置文件和API中最流行的数据交换格式之一。以高性能和内存安全性著称的Rust语言,通过serde_json库提供了强大的JSON处理工具。本文将详细介绍如何使用现代方法和最佳实践在Rust中执行JSON的解析和序列化。

serde库(序列化/反序列化框架)是Rust生态系统中处理数据格式的事实标准。结合serde_json,它可以轻松地将Rust结构体与JSON相互转换。



项目设置和依赖安装

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

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

serde库的features = ["derive"]标志启用了#[derive(Serialize, Deserialize)]宏,这些宏会自动生成结构体的序列化和反序列化代码。



Rust中JSON解析基础

将JSON字符串解析为动态值

解析JSON最简单的方法是使用serde_json::Value类型,它代表一个通用的JSON值:

use serde_json::Value;

fn main() { let data = r#" { "name": "阿列克谢", "age": 30, "is_student": false, "hobbies": ["阅读", "编程", "骑自行车"] }"#;

let parsed: Value = serde_json::from_str(data).expect("JSON解析错误"); println!("姓名: {}", parsed["name"]); println!("年龄: {}", parsed["age"]); println!("学生: {}", parsed["is_student"]); println!("第一个爱好: {}", parsed["hobbies"][0]);}

Value类型是一个枚举,可以包含Null、Bool、Number、String、Array或Object。这对于快速原型开发很方便,但在生产代码中最好使用强类型结构体。



将JSON解析为强类型结构体

为了安全地处理数据,定义一个与JSON模式匹配的结构体,并使用serde宏:

use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]struct Person { name: String, age: u32, is_student: bool, hobbies: Vec<String>,}

fn main() { let json_str = r#" { "name": "玛丽亚", "age": 25, "is_student": true, "hobbies": ["绘画", "音乐"] }"#;

let person: Person = serde_json::from_str(json_str) .expect("反序列化错误"); println!("{:?}", person); println!("{} 是否在学习: {}", person.name, person.is_student);}

这种方法的优点是编译器在编译时检查类型,从而消除了与错误字段访问相关的运行时错误。



将数据序列化为JSON

将结构体转换为JSON字符串

序列化通过serde_json::to_string()函数执行:

use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]struct Product { id: u64, name: String, price: f64, in_stock: bool,}

fn main() { let product = Product { id: 42, name: "笔记本电脑".to_string(), price: 89999.99, in_stock: true, };

let json_string = serde_json::to_string(&product) .expect("序列化错误"); println!("JSON: {}", json_string); // 美化输出,带缩进

博客

书籍推荐