Arbeiten mit JSON in Rust: Parsen und Serialisieren von Daten

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
```html

Einleitung: Warum JSON für Rust-Entwickler wichtig ist

JSON (JavaScript Object Notation) bleibt eines der beliebtesten Datenformate für den Austausch in der Webentwicklung, bei Mikrodiensten und APIs. Für die Sprache Rust, die aufgrund ihrer Leistung und Sicherheit rasant an Popularität gewinnt, ist die Arbeit mit JSON eine kritische Aufgabe. Ob Sie ein Backend mit Actix oder Rocket entwickeln, ein CLI-Tool schreiben oder mit WebSockets arbeiten – die Fähigkeit, JSON in Rust zu parsen und zu serialisieren, wird sich auf jeden Fall als nützlich erweisen.

In diesem Artikel werden wir uns ansehen, wie man mit JSON in Rust effizient arbeitet, unter Verwendung des Standard-Ökosystems der Crates serde und serde_json. Sie erfahren, wie Sie Datenstrukturen in JSON und zurück umwandeln, Fehler behandeln und mit dynamischen Daten arbeiten.



Grundlagen: Abhängigkeiten installieren und einbinden

Für die Arbeit mit JSON in Rust wird das leistungsstarke Serialisierungs-Framework Serde und seine Implementierung für JSON, der Crate serde_json, verwendet. Fügen Sie sie zunächst zu Ihrer Cargo.toml hinzu:

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

Das Flag features = ["derive"] ermöglicht die Verwendung der Makros #[derive(Serialize, Deserialize)], was den Code erheblich vereinfacht.



Basis-Parsing eines JSON-Strings

Der einfachste Weg, um zu beginnen, ist das Parsen eines JSON-Strings in den universellen Typ serde_json::Value. Dies ist das Äquivalent zu serde_json::Value in Python oder object in JavaScript:

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("Fehler beim Parsen von JSON"); println!("Name: {}", parsed["name"]); println!("Jahr: {}", parsed["year"]); println!("Erstes Feature: {}", parsed["features"][0]);}

Der Typ Value kann sein: Null, Bool, Number, String, Array oder Object. Dies ist praktisch für das Prototyping, aber für Produktionscode ist eine strenge Typisierung besser geeignet.



Serialisierung und Deserialisierung von Strukturen

Die Hauptstärke von Serde ist die automatische Umwandlung zwischen Rust-Strukturen und JSON. Betrachten wir ein Beispiel:

use serde::{Serialize, Deserialize};

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

fn main() { // Deserialisierung (JSON -> Rust) let json_str = r#"{"id":1,"name":"Alexej","email":"alex@example.com","active":true}"#; let user: User = serde_json::from_str(json_str).unwrap(); println!("Benutzer: {:?}", user);

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

Beachten Sie to_string_pretty – es formatiert JSON mit Einzügen für die Lesbarkeit. Verwenden Sie für die Produktion to_string (ohne überflüssige Leerzeichen).



Arbeiten mit verschachtelten Strukturen

JSON enthält oft verschachtelte Objekte und Arrays. Serde kommt damit problemlos zurecht:

#[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": [```

Blogs

Buchempfehlungen