JSON обработка в Rust: обзор ключевых библиотек и инструментов
JSON (JavaScript Object Notation) остаётся одним из самых популярных форматов для обмена данными между сервисами, конфигурационными файлами и API. В экосистеме Rust существует несколько мощных библиотек для работы с JSON, каждая из которых решает свои задачи — от максимальной производительности до удобства разработки. В этой статье мы подробно разберём основные инструменты: serde_json, simd-json, json5, jsonwebtoken и покажем, как их использовать в реальных проектах.
1. serde_json — стандарт де-факто
serde_json — это основная библиотека для сериализации и десериализации JSON в Rust. Она построена поверх фреймворка 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(())
}
Возможности:
- Поддержка вложенных структур, перечислений и опциональных полей.
- Работа с произвольным JSON через
serde_json::Value(enum с вариантамиNull,Bool,Number,String,Array,Object). - Кастомные сериализаторы через атрибуты
#[serde(rename)],#[serde(skip)]и другие. - Потоковая обработка (streaming) для больших файлов.
Когда использовать: для 95% проектов — это лучший выбор. Он стабилен, хорошо документирован и интегрируется с любыми веб-фреймворками (Actix, Rocket, Axum).
2. simd-json — максимальная производительность
simd-json — это библиотека, использующая SIMD-инструкции (Single Instruction, Multiple Data) процессора для ускорения парсинга JSON. По тестам, она в 2–3 раза быстрее serde_json на больших объёмах данных.
Установка:
[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);
}
}
}
Особенности:
- Работает только на x86-64 с поддержкой AVX2 (современные процессоры).
- Требует мутабельных входных данных (для избежания лишних аллокаций).
- Поддерживает потоковый парсинг и сериализацию через
simd_json::json!макрос.
Когда использовать: в высоконагруженных системах, где каждый микросекунда на счету (например, обработка миллионов JSON-логов в секунду).
3. json5 — человеко-читаемый JSON с комментариями
json5 — это реализация спецификации JSON5 (расширенный JSON), который поддерживает комментарии, trailing запятые