Arbeiten mit JSON in Swift: Parsen und Serialisierung
JSON (JavaScript Object Notation) ist ein leichtgewichtiges Datenaustauschformat, das häufig in Webdiensten und mobilen Anwendungen verwendet wird. Im Apple-Ökosystem (iOS, macOS, watchOS, tvOS) ist die Arbeit mit JSON ein wesentlicher Bestandteil der Entwicklung: vom Laden von Daten vom Server bis zum Speichern von App-Einstellungen. In diesem Artikel werden wir detailliert betrachten, wie man JSON in Swift parst (dekodiert) und serialisiert (kodiert), unter Verwendung der integrierten Protokolle Codable, JSONDecoder und JSONEncoder.
1. Grundlagen von Codable: Datenmodell
Der moderne Ansatz zur Arbeit mit JSON in Swift basiert auf dem Protokoll Codable, das zwei Protokolle vereint: Encodable (für die Serialisierung) und Decodable (für das Parsen). Damit Ihre Struktur oder Klasse in JSON und zurück konvertiert werden kann, reicht es aus, sie als Codable zu deklarieren.
Betrachten wir ein Beispiel eines Benutzermodells:
struct User: Codable { let id: Int let name: String let email: String let isActive: Bool}Wenn die Schlüssel im JSON von den Eigenschaftsnamen in Swift abweichen (z. B. wird snake_case anstelle von camelCase verwendet), können Sie die Aufzählung CodingKeys verwenden:
struct User: Codable { let id: Int let fullName: String let email: String let isActive: Bool
enum CodingKeys: String, CodingKey { case id case fullName = "full_name" case email case isActive = "is_active" }}2. JSON parsen mit JSONDecoder
Zum Konvertieren von JSON-Strings oder -Daten in Swift-Objekte wird JSONDecoder verwendet. Die Hauptmethode ist decode(_:from:), die den Datentyp (der Decodable entspricht) und ein Data-Objekt akzeptiert.
Beispiel für das Parsen eines JSON-Strings, der von einer API empfangen wurde:
let jsonString = """{ "id": 1, "name": "Ivan Petrov", "email": "ivan@example.com", "is_active": true}"""
let jsonData = Data(jsonString.utf8)
do { let decoder = JSONDecoder() let user = try decoder.decode(User.self, from: jsonData) print("Benutzer: \\(user.name), E-Mail: \\(user.email)")} catch { print("Dekodierungsfehler: \\(error.localizedDescription)")}Oft kommt JSON als Array von Objekten. In diesem Fall geben Sie einfach den Typ [User].self an:
let jsonArrayString = """[ {"id": 1, "name": "Ivan", "email": "ivan@test.com", "is_active": true}, {"id": 2, "name": "Maria", "email": "maria@test.com", "is_active": false}]"""
let jsonArrayData = Data(jsonArrayString.utf8)
do { let users = try JSONDecoder().decode([User].self, from: jsonArrayData) users.forEach { print($0.name) }} catch { print("Fehler: \\(error)")}3. Serialisierung von Objekten in JSON mit JSONEncoder
Der umgekehrte Prozess – die Konvertierung eines Swift-Objekts in JSON – wird mit JSONEncoder durchgeführt. Die Methode encode(_:) gibt ein Data-Objekt zurück, das dann in einen String umgewandelt oder an den Server gesendet werden kann.
let user = User(id: 3, fullName: "Alexey Smirnov", email: "alex@example.com", isActive: true)
do { let encoder = JSONEncoder() encoder.outputFormatting = .prettyPrinted // für lesbare Formatierung let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Kodierungsfehler: \\(error)")}Die Ausgabe sieht folgendermaßen aus:
{ "id" : 3, "full_name" : "Alexey Smirnov", "email" : "alex@example.com", "is_active" : true}Beachten Sie, dass JSO