Arbeiten mit JSON in Swift: Parsen und Serialisierung
JSON (JavaScript Object Notation) hat sich zum De-facto-Standard für den Datenaustausch zwischen Client und Server in mobilen und Desktop-Anwendungen entwickelt. Im Swift-Ökosystem (iOS/macOS) ist die Arbeit mit JSON auf höchstem Niveau implementiert – von einfachem JSONSerialization bis zum leistungsstarken Codable-Protokoll. In diesem Artikel behandeln wir alle wichtigen Methoden zum Parsen und Serialisieren von JSON in Swift, geben praktische Beispiele und zeigen, wie Sie häufige Fehler vermeiden.
1. Grundlagen der Arbeit mit JSON in Swift: JSONSerialization
Vor Swift 4 war das Hauptwerkzeug für die Arbeit mit JSON die Klasse JSONSerialization, die Teil von Foundation ist. Sie ermöglicht es, JSON-Daten in Swift-Objekte (Wörterbücher, Arrays, Zeichenketten, Zahlen) und zurück zu konvertieren. Diese Methode bleibt relevant, wenn Sie die volle Kontrolle über den Prozess benötigen oder mit Legacy-Code arbeiten.
JSON parsen mit JSONSerialization
Angenommen, wir haben eine JSON-Zeichenkette vom Server erhalten:
let jsonString = """{ "name": "Ivan", "age": 30, "isPremium": true, "hobbies": ["reading", "running", "programming"]}"""
guard let jsonData = jsonString.data(using: .utf8) else { fatalError("Error encoding string to Data")}
do { if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { let name = jsonObject["name"] as? String ?? "" let age = jsonObject["age"] as? Int ?? 0 let isPremium = jsonObject["isPremium"] as? Bool ?? false let hobbies = jsonObject["hobbies"] as? [String] ?? [] print("Name: \\(name), Age: \\(age), Premium: \\(isPremium), Hobbies: \\(hobbies)") }} catch { print("JSON parsing error: \\(error.localizedDescription)")}Der Nachteil dieses Ansatzes ist die Notwendigkeit, Typen manuell zu casten und optionale Werte zu behandeln. Der Code wird umständlich und fehleranfällig.
Serialisierung zu JSON mit JSONSerialization
Der umgekehrte Prozess – Konvertierung eines Swift-Wörterbuchs in JSON-Daten:
let personDict: [String: Any] = [ "name": "Maria", "age": 25, "isPremium": false, "hobbies": ["drawing", "yoga"]]
do { let jsonData = try JSONSerialization.data(withJSONObject: personDict, options: .prettyPrinted) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Serialization error: \\(error.localizedDescription)")}Die Option .prettyPrinted macht die Ausgabe menschenlesbar. Für die Produktion wird üblicherweise [] (keine Formatierung) verwendet, um Bandbreite zu sparen.
2. Moderner Ansatz: Codable-Protokoll und JSONDecoder
Ab Swift 4 wurde die Arbeit mit JSON durch das Codable-Protokoll (das Encodable und Decodable kombiniert) erheblich vereinfacht. Sie beschreiben einfach die Datenstruktur, und der Compiler generiert automatisch den Code zum Kodieren/Dekodieren.
JSON parsen mit JSONDecoder
Definieren wir ein Modell für unser JSON:
struct Person: Codable { let name: String let age: Int let isPremium: Bool let hobbies: [String]}
let jsonString = """{ "name": "Ivan", "age": 30, "isPremium": true, "hobbies": ["reading", "running", "programming"]}"""
guard let jsonData = jsonString.data(using: .utf8) else { fatalError("Error encoding string")}
do { let person = try JSONDecoder().decode(Person.self, from: jsonData) print("Name: \\(person.name), Age: \\(person.age), Premium: \\(person.isPremium), Hobbies: \\(person.hobbies)")} catch { print("Decoding error: \\(error.localizedDescription)")}Wie Sie sehen, ist der Code viel sauberer geworden. Alle Typumwandlungen und Prüfungen