JSON обработка в Rust: serde_json, simd-json, json5 и другие библиотеки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 запятые

Рекомендаций