14. Oktober 2019

JSON-Daten in Swift

JSON-Daten

Das JSON-Format (JavaScript Object Notation) eignet sich aufgrund seiner einfach lesbaren Textform sehr gut für den Austausch strukturierter Daten zwischen Anwendungen. Dabei werden Daten über assoziative Arrays {...} und Listen [...] repräsentiert, beispielsweise:

[
    {
        "name": "Bob",
        "age": 32,
        "phone": [
            { "type": "Handy", "number": "0123-456789" },
            { "type": "Festnetz", "number": "040-456789" }
        ]
    },
    {
        "name": "Alice",
        "age": 56,
        "address": {
            "street": "Musterstrasse 12",
            "zip": "20095",
            "city": "Hamburg"
        }
    }    
]

JSON-Daten in Swift verarbeiten

Die Foundation-Klassen JSONDecoder und JSONEncoder erlauben eine Konvertierung von JSON-Daten zu Swift-Typen. Dabei empfiehlt es sich, Datentypen als struct zu definieren, die 1:1 der Struktur aus dem JSON entsprechen. Diese müssen mit dem Protokoll Codable versehen werden.

import Foundation

struct Person: Codable {
    let name: String
    let age: Int
    let phone: [Phone]?
    let address: Address?
}

struct Address: Codable {
    let street, zip, city: String
}

struct Phone: Codable {
    let type, number: String
}

Tipp: Mit dem Tool Quicktype können anhand von Beispieldaten entsprechende Swift-Typen generiert werden.

Ein Data-Objekt mit JSON-Daten könnte folgendermaßen geparst werden:

let jsonDecoder = JSONDecoder()
let persons = try jsonDecoder.decode(Person.self, from: jsonData)

Ein Codable-Objekt kann folgendermaßen als JSON serialisiert werden:

let jsonEncoder = JSONEncoder()
let jsonResultData = try jsonEncoder.encode(persons)