Objektserialisierung in Swift (iOS/macOS): Codable, JSON und PropertyList

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

Objektserialisierung in Swift (iOS/macOS): Codable, JSON und PropertyList



Serialisierung ist der Prozess der Umwandlung von Datenobjekten in ein Format, das für die Speicherung oder Übertragung geeignet ist (z. B. JSON, XML, Property List). Im Apple-Ökosystem (iOS, macOS, watchOS, tvOS) bietet Swift einen leistungsstarken und eleganten Mechanismus für die Serialisierung und Deserialisierung – das Protokoll Codable. In diesem Artikel werden wir im Detail besprechen, wie man Codable, JSONEncoder, PropertyListEncoder und deren Gegenstücke für die Arbeit mit Daten verwendet.



Was ist Codable?

Codable ist ein zusammengesetztes Protokoll, das Encodable (zum Kodieren eines Objekts in ein externes Format) und Decodable (zum Dekodieren aus einem externen Format in ein Objekt) vereint. Wenn Ihre Swift-Struktur oder -Klasse Codable entspricht, haben Sie automatisch die Möglichkeit, sie zu serialisieren und zu deserialisieren.



Grundlegende Deklaration:

struct User: Codable {    let id: Int    let name: String    let email: String}


Alle standardmäßigen Swift-Typen (String, Int, Double, Bool, Date, Data, URL und sogar optionale Typen sowie Arrays/Dictionaries) entsprechen bereits Codable.



Kodierung in JSON

Zum Kodieren eines Objekts in JSON wird JSONEncoder verwendet. Beispiel:

let user = User(id: 1, name: "Ivan Petrov", email: "ivan@example.com")let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // für hübsche Ausgabe

do { let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Kodierungsfehler: \\(error)")}


Ergebnis:

{  "id" : 1,  "name" : "Ivan Petrov",  "email" : "ivan@example.com"}


Dekodierung aus JSON

Für die umgekehrte Umwandlung wird JSONDecoder verwendet:

let jsonString = """{  "id": 2,  "name": "Maria Sidorova",  "email": "maria@example.com"}"""let jsonData = Data(jsonString.utf8)let decoder = JSONDecoder()

do { let decodedUser = try decoder.decode(User.self, from: jsonData) print("Dekodierter Benutzer: \\(decodedUser.name)")} catch { print("Dekodierungsfehler: \\(error)")}


Arbeiten mit Property List (plist)

Für die Serialisierung in das XML-Property-List-Format werden PropertyListEncoder und PropertyListDecoder verwendet. Dies ist nützlich zum Speichern von Daten in Konfigurationsdateien oder UserDefaults.



// Kodierung in plistlet encoder = PropertyListEncoder()encoder.outputFormat = .xml

do { let plistData = try encoder.encode(user) // plistData kann in einer Datei oder UserDefaults gespeichert werden} catch { print("Plist-Kodierungsfehler: \\(error)")}

// Dekodierung aus plistlet decoder = PropertyListDecoder()do { let decodedUser = try decoder.decode(User.self, from: plistData) print(decodedUser)} catch { print("Plist-Dekodierungsfehler: \\(error)")}


Benutzerdefinierte Schlüssel (CodingKeys)

Manchmal stimmen die Eigenschaftsnamen in Swift nicht mit den Schlüsseln in JSON überein. Dafür wird die Aufzählung CodingKeys verwendet:

struct Product: Codable {    let productId: Int    let productName: String    let price: Double

enum CodingKeys: String, CodingKey { case productId = "product_id" case productName = "product_name" case price }}


Jetzt wird JSON mit den Schlüsseln product_id und product_name korrekt verarbeitet.



Verarbeitung von Daten und anderen speziellen Typen

Standardmäßig kodieren JSONEncoder und JSONDecoder Daten als TimeInterval

Empfehlungen