Arbeiten mit YAML in Rust: Die Bibliothek serde_yaml

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

Bibliothek serde_yaml: Arbeiten mit YAML in Rust

\n\n

YAML (YAML Ain't Markup Language) ist eines der beliebtesten Daten-Serialisierungsformate, das häufig für Konfigurationsdateien, die Beschreibung von Datenstrukturen und den Informationsaustausch zwischen Diensten verwendet wird. Im Rust-Ökosystem gibt es für die Arbeit mit YAML die ausgereifte und leistungsstarke Bibliothek serde_yaml, die auf dem leistungsfähigen Serialisierungs-Framework serde aufbaut. In diesem Artikel werden wir im Detail besprechen, wie man YAML-Dokumente in Rust parst, erstellt und verarbeitet.

\n\n

Installation und Einbindung

\n

Fügen Sie zunächst die folgenden Abhängigkeiten zu Ihrer Cargo.toml hinzu:

\n
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_yaml = "0.9"
\n

Die Bibliothek serde_yaml zieht automatisch alle notwendigen Komponenten zum Parsen und Generieren von YAML nach.

\n\n

Basis-Deserialisierung (YAML → Rust-Struktur)

\n

Das häufigste Szenario ist das Lesen einer Konfigurationsdatei. Definieren wir eine Struktur, die dem YAML-Dokument entspricht:

\n
use serde::Deserialize;\n\n#[derive(Debug, Deserialize)]\nstruct Config {\n    server: ServerConfig,\n    database: DatabaseConfig,\n}\n\n#[derive(Debug, Deserialize)]\nstruct ServerConfig {\n    host: String,\n    port: u16,\n    workers: Option<u32>,\n}\n\n#[derive(Debug, Deserialize)]\nstruct DatabaseConfig {\n    url: String,\n    pool_size: u32,\n}
\n

Jetzt lesen wir eine YAML-Datei und wandeln sie in die Struktur um:

\n
use std::fs;\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    let yaml_content = fs::read_to_string("config.yaml")?;\n    let config: Config = serde_yaml::from_str(&yaml_content)?;\n    \n    println!("Server: {}:{}", config.server.host, config.server.port);\n    println!("Datenbank: {}", config.database.url);\n    \n    Ok(())\n}
\n

Beispiel der Datei config.yaml:

\n
server:\n  host: "127.0.0.1"\n  port: 8080\n  workers: 4\ndatabase:\n  url: "postgres://user:pass@localhost/db"\n  pool_size: 10
\n\n

Serialisierung (Rust-Struktur → YAML)

\n

Der umgekehrte Prozess – Erstellen eines YAML-Dokuments aus Daten im Speicher:

\n
use serde::Serialize;\n\n#[derive(Debug, Serialize)]\nstruct Project {\n    name: String,\n    version: String,\n    dependencies: Vec<Dependency>,\n}\n\n#[derive(Debug, Serialize)]\nstruct Dependency {\n    name: String,\n    version: String,\n    optional: bool,\n}\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    let project = Project {\n        name: "my-app".to_string(),\n        version: "0.1.0".to_string(),\n        dependencies: vec![\n            Dependency {\n                name: "serde".to_string(),\n                version: "1.0".to_string(),\n                optional: false,\n            },\n            Dependency {\n                name: "tokio".to_string(),\n                version: "1.35".to_string(),\n                optional: true,\n            },\n        ],\n    };\n\n    let yaml_string = serde_yaml::to_string(&project)?;\n    println!("{}", yaml_string);\n    \n    // In Datei speichern\n    std::fs::write("project.yaml", &yaml_string)?;\n    \n    Ok(())\n}
\n\n

Arbeiten mit beliebigen YAML-Dokumenten

\n

Manchmal ist die Struktur von YAML im Voraus unbekannt. In solchen Fällen verwenden Sie serde_yaml::Value:

\n
use serde_yaml::Value;\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    let yaml_data = "\napiVersion: v1\nkind: Service\nmetadata:\n  name: my-service\n  labels:\n    app: web\nspec:\n  ports:\n    - port: 80\n      targetPort: 8080\n  selector:\n    app: web\n";\n    \n    let value: Value = serde_yaml::from_str(yaml_data)?;\n    \n    // Zugriff auf verschachtelte Daten\n    if let Some(ports) = value["spec"]["ports"].as_sequence() {\n        for port in ports {\n            if let Some(port_num                    

Empfehlungen