在 Rust 中处理 JSON:数据解析与序列化

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

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

开始课程
```html

引言:为什么JSON对Rust开发者很重要

JSON(JavaScript Object Notation)仍然是Web开发、微服务和API中最流行的数据交换格式之一。对于凭借其高性能和安全性而迅速流行的Rust语言来说,处理JSON是一项至关重要的任务。无论您是使用Actix或Rocket的后端开发者,编写CLI工具,还是处理WebSocket,掌握在Rust中解析和序列化JSON的能力都必将派上用场。

在本文中,我们将探讨如何利用标准生态系统中的crate serde 和 serde_json 在Rust中高效地处理JSON。您将学习如何将数据结构与JSON相互转换、处理错误以及处理动态数据。

基础:安装和添加依赖

在Rust中处理JSON,需要使用强大的序列化框架 Serde 及其针对JSON的实现——crate serde_json。要开始使用,请将它们添加到您的 Cargo.toml 中:

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

标志 features = ["derive"] 允许使用宏 #[derive(Serialize, Deserialize)],这大大简化了代码。

基础JSON字符串解析

最简单的入门方法是将JSON字符串解析为通用类型 serde_json::Value。这类似于Python中的 dict 或JavaScript中的 object:

use serde_json::Value;

fn main() {
    let data = r#"
        {
            "name": "Rust",
            "year": 2015,
            "features": ["safe", "fast", "concurrent"]
        }"#;

    let parsed: Value = serde_json::from_str(data).expect("JSON解析错误");
    
    println!("名称: {}", parsed["name"]);
    println!("年份: {}", parsed["year"]);
    println!("第一个特性: {}", parsed["features"][0]);
}

类型 Value 可以是:Null、Bool、Number、String、Array 或 Object。这对于原型开发很方便,但在生产代码中最好使用强类型。

结构体的序列化与反序列化

Serde的主要优势在于Rust结构体与JSON之间的自动转换。让我们通过一个例子来看:

use serde::{Serialize, Deserialize};

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

fn main() {
    // 反序列化 (JSON -> Rust)
    let json_str = r#"{"id":1,"name":"阿列克谢","email":"alex@example.com","active":true}"#;
    let user: User = serde_json::from_str(json_str).unwrap();
    println!("用户: {:?}", user);

    // 序列化 (Rust -> JSON)
    let new_user = User {
        id: 2,
        name: String::from("玛丽亚"),
        email: String::from("maria@example.com"),
        active: false,
    };
    let json_output = serde_json::to_string_pretty(&new_user).unwrap();
    println!("JSON:{}", json_output);
}

请注意 to_string_pretty——它会格式化JSON并添加缩进以提高可读性。在生产环境中,请使用 to_string(不带多余空格)。

处理嵌套结构体

JSON通常包含嵌套对象和数组。Serde可以轻松处理这种情况:

#[derive(Serialize, Deserialize)]
struct Project {
    name: String,
    languages: Vec<String>,
    contributors: Vec<Contributor>,
}

#[derive(Serialize, Deserialize)]
struct Contributor {
    username: String,
    contributions: u32,
}

fn main() {
    let project_json = r#"
    {
        "name": "Serde",
        "languages": ["Rust", "Python", "C++"],
        "contributors": [
```                

博客

书籍推荐