Rust 中的 JSON 处理:serde_json 和 json 库

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

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

开始课程

Rust 中的 JSON 处理:serde_json 与数据处理



JSON(JavaScript Object Notation)仍然是 Web 开发、API 和配置文件中数据交换最流行的格式之一。在以其性能和安全性著称的 Rust 语言中,JSON 处理通过强大的 crate 生态系统实现。主要工具是构建在 serde 序列化框架之上的 serde_json 库。在本文中,我们将详细介绍如何在 Rust 中解析、创建和转换 JSON,并探讨替代方法。



1. 安装和引入 serde_json



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



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


serde 提供了 Serialize 和 Deserialize trait,而 serde_json 提供了针对 JSON 的具体实现。添加 crate 后,可以在代码中导入它们:



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


2. 将结构体序列化为 JSON



要将 Rust 结构体转换为 JSON,需要使用 #[derive(Serialize)] 属性对其进行注解。以下是一个包含用户数据的示例:



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

fn main() -> Result<()> { let user = User { name: "Alexey".to_string(), age: 30, email: "alex@example.com".to_string(), active: true, };

let json = serde_json::to_string(&user)?; println!("{}", json); // 输出: {"name":"Alexey","age":30,"email":"alex@example.com","active":true} Ok(())}


serde_json::to_string 方法返回 Result<String>。要获得格式化输出,请使用 serde_json::to_string_pretty。



3. 将 JSON 反序列化为结构体



反向过程——将 JSON 字符串转换为 Rust 结构体。为此,结构体必须实现 Deserialize:



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

fn main() -> Result<()> { let data = r#" { "name": "Maria", "age": 25, "email": "maria@example.com", "active": false }"#;

let user: User = serde_json::from_str(data)?; println!("{:?}", user); // 输出: User { name: "Maria", age: 25, email: "maria@example.com", active: false } Ok(())}


如果 JSON 包含结构体中不存在的字段,或者相反,请使用 #[serde(default)] 或 #[serde(skip_serializing_if = "Option::is_none")] 属性。



4. 处理任意 JSON(Value)



有时数据结构事先未知。在这种情况下,可以使用 serde_json::Value 枚举,它可以表示任何 JSON 类型:



use serde_json::Value;

fn main() -> Result<()> { let data = r#" { "name": "Ivan", "age": 35, "hobbies": ["reading", "programming"], "address": null }"#;

let v: Value = serde_json::from_str(data)?;

// 访问字段 if let Some(name) = v.get("name") { println!("Name: {}", name); }

// 提取数组 if let Some(hobbies) = v.get("hobbies").and_then(|h| h.as_array()) { for hobby in hobbies { println!("Hobby: {}", hobby); } }

Ok(())}


Value 支持 as_str()、as_u64()、as_array() 等方法,用于安全地提取数据。

\

推荐