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 CLI-Frameworks für Go (Golang): Ein vollständiger Überblick über Tools zur Erstellung von Konsolenanwendungen Elasticsearch C++-Client: Vollständiger Leitfaden für die Arbeit mit der Suchmaschine Logging für Java: Die besten Lösungen (Log4j, SLF4J, Logback, java.util.logging) PDF-Erstellung in Go (Golang): Bibliotheken und BeispieleJSONEncoder und JSONDecoder Daten als TimeInterval
Auch in der Bibliothek
Empfehlungen