JSON-Verarbeitung in Rust: serde_json, simd-json, json5 und andere Bibliotheken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

JSON-Verarbeitung in Rust: Überblick über wichtige Bibliotheken und Werkzeuge



JSON (JavaScript Object Notation) bleibt eines der beliebtesten Formate für den Datenaustausch zwischen Diensten, Konfigurationsdateien und APIs. Im Rust-Ökosystem gibt es mehrere leistungsstarke Bibliotheken für die Arbeit mit JSON, die jeweils ihre eigenen Aufgaben lösen – von maximaler Leistung bis hin zu Entwicklerfreundlichkeit. In diesem Artikel werden wir die wichtigsten Werkzeuge im Detail besprechen: serde_json, simd-json, json5, jsonwebtoken und zeigen, wie man sie in realen Projekten einsetzt.



1. serde_json – der De-facto-Standard



serde_json ist die primäre Bibliothek für die Serialisierung und Deserialisierung von JSON in Rust. Sie baut auf dem serde-Framework auf, was eine automatische Umwandlung von Rust-Datenstrukturen in JSON und zurück ermöglicht.



Installation: Fügen Sie in Cargo.toml hinzu:



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


Beispiel: Serialisierung und Deserialisierung



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: "Anna".to_string(), age: 30, email: Some("anna@example.com".to_string()), };

// Serialisierung in einen JSON-String let json_string = serde_json::to_string(&user)?; println!("JSON: {}", json_string);

// Deserialisierung zurück in die Struktur let deserialized: User = serde_json::from_str(&json_string)?; println!("{:?}", deserialized);

Ok(())}


Funktionen:

  • Unterstützung für verschachtelte Strukturen, Aufzählungen und optionale Felder.
  • Arbeit mit beliebigem JSON über serde_json::Value (Enum mit Varianten Null, Bool, Number, String, Array, Object).
  • Benutzerdefinierte Serialisierer über Attribute wie #[serde(rename)], #[serde(skip)] und andere.
  • Streaming-Verarbeitung für große Dateien.


Wann verwenden: Für 95% der Projekte ist dies die beste Wahl. Sie ist stabil, gut dokumentiert und integriert sich mit allen Web-Frameworks (Actix, Rocket, Axum).



2. simd-json – maximale Leistung



simd-json ist eine Bibliothek, die SIMD-Instruktionen (Single Instruction, Multiple Data) des Prozessors nutzt, um das JSON-Parsing zu beschleunigen. Laut Tests ist sie bei großen Datenmengen 2–3 Mal schneller als serde_json.



Installation:



[dependencies]simd-json = "0.14"


Beispiel: Schnelles Parsing



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

fn main() { let mut data = br#"[{"city":"Moskau","temp":22},{"city":"St. Petersburg","temp":18}]"#.to_vec(); // Parsing mit Mutation der Eingabedaten (für Geschwindigkeit) 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("unbekannt"); let temp = item.get("temp").and_then(|v| v.as_f64()).unwrap_or(0.0); println!("{}: {}°C", city, temp); } }}


Besonderheiten:

  • Funktioniert nur auf x86-64 mit AVX2-Unterstützung (moderne Prozessoren).
  • Erfordert veränderbare Eingabedaten (um unnötige Allokationen zu vermeiden).
  • Unterstützt Streaming-Parsing und Serialisierung über das simd_json::json!-Makro.


<

Empfehlungen