Rust中的JSON处理:serde_json、simd-json、json5及其他库

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

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

开始课程

Rust中的JSON处理:关键库与工具概述



JSON(JavaScript对象表示法)仍然是服务间数据交换、配置文件及API中最流行的格式之一。在Rust生态系统中,有多个强大的库可用于处理JSON,每个库都针对特定任务——从最大化性能到提升开发便利性。本文将详细解析主要工具:serde_json、simd-json、json5、jsonwebtoken,并展示如何在实际项目中使用它们。



1. serde_json——事实上的标准



serde_json是Rust中用于JSON序列化和反序列化的主要库。它构建在serde框架之上,能够自动将Rust数据结构转换为JSON,反之亦然。



安装:在Cargo.toml中添加:



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


示例:序列化与反序列化



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

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

fn main() -> Result<()> { let user = User { name: "安娜".to_string(), age: 30, email: Some("anna@example.com".to_string()), };

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

// 反序列化回结构体 let deserialized: User = serde_json::from_str(&json_string)?; println!("{:?}", deserialized);

Ok(())}


功能特性:

  • 支持嵌套结构、枚举和可选字段。
  • 通过serde_json::Value(包含Null、Bool、Number、String、Array、Object变体的枚举)处理任意JSON。
  • 通过#[serde(rename)]、#[serde(skip)]等属性实现自定义序列化器。
  • 支持大文件的流式处理。


使用场景:对于95%的项目而言,这是最佳选择。它稳定、文档完善,并能与任何Web框架(Actix、Rocket、Axum)集成。



2. simd-json——极致性能



simd-json是一个利用CPU的SIMD(单指令多数据流)指令来加速JSON解析的库。根据测试,在处理大量数据时,其速度比serde_json快2-3倍。



安装:



[dependencies]simd-json = "0.14"


示例:快速解析



use simd_json::prelude::*;use simd_json::BorrowedValue;

fn main() { let mut data = br#"[{"city":"莫斯科","temp":22},{"city":"圣彼得堡","temp":18}]"#.to_vec(); // 通过修改输入数据进行解析(以提高速度) let value: BorrowedValue = simd_json::to_borrowed_value(&mut data).unwrap(); if let Some(arr) = value.as_array() { for item in arr { let city = item.get("city").and_then(|v| v.as_str()).unwrap_or("未知"); let temp = item.get("temp").and_then(|v| v.as_f64()).unwrap_or(0.0); println!("{}: {}°C", city, temp); } }}


特点:

  • 仅适用于支持AVX2的x86-64架构(现代处理器)。
  • 需要可变的输入数据(以避免不必要的内存分配)。
  • 通过simd_json::json!宏支持流式解析和序列化。


<

推荐