Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS SDK

Erste Schritte mit JSONModel

by
Read Time:11 minsLanguages:

German (Deutsch) translation by Federicco Ancie (you can also view the original English article)

Was ist JSONModel?

Unsere iOS-Geräte sind die meiste Zeit mit dem Internet verbunden, und natürlich stellen die meisten Apps auf unseren Geräten eine Verbindung zu einem Remote-Server her, um ab und zu diesen oder jenen Datenblock abzurufen.

Einige Apps verbrauchen nur wenig Daten und rufen etwa jede Stunde die neuesten Schlagzeilen ab. Andere Apps interagieren viel mit einem Backend-Dienst, während der Benutzer seinen sozialen Feed durchsucht, Beiträge liest und Fotos hochlädt.

Die Zeiten, in denen jeder Webdienst XML sprach, sind lange vorbei. Heutzutage kommunizieren die meisten mobilen Anwendungen über JSON mit Webdiensten. Wenn Sie vorhaben, eine mobile Anwendung zu erstellen, die mit einem Remote-Backend kommuniziert, müssen Sie möglicherweise JSON senden und empfangen können.

JSONModel ist eine in Objective-C geschriebene Open Source-Bibliothek, mit der Sie JSON von einem Server abrufen, analysieren und Ihre Modellklassen mit den Daten initialisieren können. Außerdem werden die JSON-Daten, Kaskaden durch verschachtelte Modelle und mehr validiert.

"Aber warte!" Sie denken vielleicht: "Ich habe schon eine iPhone-App geschrieben, die JSON abruft und auf dem Bildschirm anzeigt. Das war ziemlich einfach!"

Nun, das stimmt teilweise. NSJSONSerialization ist seit iOS 5 verfügbar, daher ist es in der Tat ziemlich einfach, eine JSON-Antwort in ein NSDictionary-Objekt zu konvertieren. Dies funktioniert gut für einfache Anwendungen, aber glauben Sie mir, wenn ich sage, dass dies keine gute Idee für eine komplexe Anwendung mit einem komplexen Datenmodell ist. Mal sehen, wie JSONModel Ihren Speck retten kann.

Beachten Sie, dass ich der Autor von JSONModel bin und die Bibliothek mithilfe von Mitwirkenden auf GitHub entwickelt und pflegt. Ich bin offensichtlich voreingenommen, aber das sind gute Nachrichten für Sie, da Sie von der Person lernen können, die die Bibliothek erstellt hat.

Grundfunktionen

In diesem Abschnitt werde ich kurz die grundlegenden Funktionen der Bibliothek hervorheben und diskutieren. Wenn Sie zu gerne in Code eintauchen möchten, fahren Sie mit dem nächsten Abschnitt, der Hello Chuck App, fort.

Automatische Zuordnung von JSON zu Modellklassen

Wenn Sie sich die JSON-Daten ansehen, die Ihr Modellobjekt füllen, neigen Sie häufig dazu, mit den Namen der in den JSON-Daten verwendeten Schlüssel übereinzustimmen. Am Ende schreiben Sie Code, der so aussieht:

Mit JSONModel müssen Sie diese Art von Boilerplate-Code nicht schreiben. JSONModel ordnet JSON automatisch den Eigenschaften der Modellklasse zu.

Eingabevalidierung

JSONModel überprüft automatisch die Eigenschaften Ihrer Modellklasse und stellt sicher, dass der JSON, mit dem ein Modellobjekt initialisiert wird, mit der Definition der Modellklasse übereinstimmt. Wenn eine Nichtübereinstimmung vorliegt, wird das Modellobjekt nicht initialisiert.

Darüber hinaus überprüft das Modell, ob die JSON-Daten mit den von der Modellklasse definierten Typen übereinstimmen. Wenn Sie beispielsweise ein Array anstelle einer Zeichenfolge erhalten, werden die JSON-Daten als ungültig betrachtet.

Datentransformation

Aufgrund der einfachen Spezifikation von JSON ist es einfach zu verwenden, entfernt jedoch auch viele Metadaten, wenn Daten von einem Backend zu einem Client übertragen werden und umgekehrt. Ein JSON-Objekt kann nur Zeichenfolgen, Zahlen, Arrays und Objekte enthalten.

In Ihrer Objective-C-Modellklasse verfügen Sie normalerweise über Eigenschaften verschiedener Typen, die nicht auf Zeichenfolgen und Zahlen beschränkt sind. Dies sind die einzigen von JSON unterstützten Datentypen. Beispielsweise haben Sie häufig URLs in einem JSON-Objekt. Es ist einfach, eine Zeichenfolge in einem JSON-Objekt in ein NSURL-Objekt zu konvertieren, aber der ärgerliche Teil ist, dass Sie dies selbst tun müssen.

Mit JSONModel können Sie Transformationen für Datentypen einmal definieren und modellübergreifend verwenden. Wenn Sie beispielsweise in einer JSON-Antwort ein Datum als Zeitstempel in Form einer Ganzzahl erhalten, müssen Sie JSONModel nur einmal mitteilen, wie die Ganzzahl in ein NSDate-Objekt konvertiert werden soll. Weitere Informationen zu Datentransformationen finden Sie im zweiten Teil dieser Serie.

Verschachtelte Modelle

Meistens hat eine JSON-Antwort eine komplexe Struktur. Ein Objekt kann beispielsweise ein oder mehrere andere Objekte enthalten. Schauen Sie sich das folgende JSON-Objekt an.

Mit JSONModel können Sie auch Modellklassen verschachteln. Unabhängig davon, ob Ihr Modell ein anderes Modell oder ein Array von Modellobjekten enthält, überprüft JSONModel Ihre Modellklassen und initialisiert automatisch Objekte des richtigen Typs. Wir werden uns verschachtelte Modelle etwas später genauer ansehen.

Das ist genug Theorie für jetzt. Erfahren Sie, wie Sie die JSONModel-Bibliothek verwenden, indem Sie eine einfache Beispielanwendung erstellen.

Die Hello Chuck App

Nachdem Sie eine grundlegende Vorstellung davon haben, was JSONModel tut, entwickeln Sie eine einfache App, die einen JSON-Feed mit Chuck Norris-Witzen abruft und diese dem Benutzer nacheinander zeigt. Wenn Sie fertig sind, sieht die App ungefähr so aus:

Schritt 1: Projekteinrichtung

Starten Sie Xcode 5, erstellen Sie ein neues Projekt, indem Sie im Menü Datei die Option Neu > Projekt... auswählen, und wählen Sie die Vorlage für die Einzelansicht-App aus der Liste der iOS-Anwendungsvorlagen aus.

Benennen Sie das Projekt HelloChuck, teilen Sie Xcode mit, wo Sie es speichern möchten, und klicken Sie auf Erstellen. Das Projekt muss nicht unter die Quellcodeverwaltung gestellt werden.

Laden Sie als Nächstes die neueste Version der JSONModel-Bibliothek von GitHub herunter, entpacken Sie das Archiv und zeigen Sie einen Peak an.

Das Archiv enthält Demoanwendungen für iOS und OSX, Komponententests und mehr. Sie interessieren sich nur für den Ordner JSONModel. Ziehen Sie es in Ihr Xcode-Projekt. Die Installation ist noch einfacher, wenn Sie CocoaPods verwenden.

Schritt 2: Modellklassen erstellen

Der JSON-Feed, den Sie verwenden werden, ist ziemlich einfach. Es enthält eine Reihe von Witzen, wobei jeder Witz eine ID, den Witz selbst und optional eine Reihe von Tags hat.

Beginnen wir mit der Erstellung der Modellklassen, die mit den JSON-Daten übereinstimmen. Erstellen Sie eine neue Klasse, JokeModel, und erben Sie sie von JSONModel. Fügen Sie id- und text eigenschaften hinzu, um den Schlüsseln in den JSON-Daten wie folgt zu entsprechen:

Die JSONModel-Bibliothek konvertiert automatisch Zahlen, die dem Typ der Eigenschaft entsprechen.

Sie müssen auch eine Klasse für die Tag-Objekte in den JSON-Daten erstellen. Erstellen Sie eine neue Klasse, TagModel, und lassen Sie sie JSONModel erben. Deklarieren Sie zwei Eigenschaften-id und tag vom Typ NSString. Die TagModel-Klasse sollte folgendermaßen aussehen:

Beachten Sie, dass Sie den id-Typ auf NSString festgelegt haben. JSONModel weiß genau, wie man Zahlen in Zeichenfolgen umwandelt. Es übernimmt die Umwandlung für Sie. Die Idee ist, dass Sie sich nur auf die Daten konzentrieren müssen, die Sie in Ihrer Anwendung benötigen, ohne sich Gedanken darüber machen zu müssen, wie die JSON-Daten aussehen.

Obwohl die TagModel-Klasse einsatzbereit ist, müssen Sie der JokeModel-Klasse mitteilen, dass die Schlüssel-tags eine Liste von TagModel-Instanzen enthalten. Dies ist mit JSONModel sehr einfach. Fügen Sie ein neues leeres Protokoll in TagModel.h hinzu und nennen Sie es TagModel:

Öffnen Sie JokeModel.h und importieren Sie die Header-Datei der TagModel-Klasse:

Hier kommt die Magie. Deklarieren Sie JokeModel eine neue Eigenschaft wie unten gezeigt. Die Eigenschaft tags ist vom Typ NSArray und entspricht zwei Protokollen.

  1. TagModel ist das Protokoll, das Sie vor kurzem deklariert haben. Es teilt JokeModel mit, dass das Array von Tags Instanzen der TagModel-Klasse enthalten soll.
  2. Durch die Einhaltung des Optional Protokolls weiß die JokeModel-Klasse, dass die JSON-Daten nicht immer eine Liste von Tags enthalten.

Dies ist ein guter Moment, um zu betonen, dass standardmäßig jede Eigenschaft in Ihrer Modellklasse erforderlich ist. Wenn id oder text in den JSON-Daten fehlen, schlägt die Initialisierung des JokeModel-Objekts fehl. Wenn jedoch für einen bestimmten Witz keine tags vorhanden sind, wird sich JSONModel nicht darüber beschweren.

Schritt 3: Controller-Setup anzeigen

Sie müssen zunächst einige Anpassungen an der ViewController-Klasse vornehmen. Öffnen Sie ViewController.m und importieren Sie unterhalb der vorhandenen Importanweisung oben die JokeModel-Klasse:

Sie müssen der ViewController-Klasse zwei Eigenschaften hinzufügen:

  • label, um den Text des Witzes auf dem Bildschirm anzuzeigen
  • jokes, um die Reihe der Witze zu speichern

Sie müssen das Etikett auch so einrichten, dass es bereit ist, wenn Sie die JSON-Daten abrufen und einen Witz zur Anzeige bereit haben. Aktualisieren Sie die viewDidLoad-Methode wie unten gezeigt.

Sie erstellen eine UILabel-Instanz in der Größe des Gerätebildschirms und setzen die alpha-Eigenschaft auf 0. Die Bezeichnung wird ausgeblendet, bis der erste Witz angezeigt werden kann.

In der letzten Zeile von viewDidLoad rufen Sie fetchJokes auf, in dem die Anwendung die Remote-JSON-Daten abruft und deren Inhalt in der jokes-Eigenschaft des View Controllers speichert. Sie werden fetchJokes in einem Moment implementieren.

Schritt 4: JSON abrufen und Modellobjekte erstellen

In diesem Beispiel verwenden Sie die NSURLSession-Klasse, um die Remote-JSON-Daten abzurufen. Sie erstellen die URL für die Anforderung, initialisieren eine Datenaufgabe und senden sie unterwegs.

dataTaskWithURL:completionHandler: Erstellt für eine NSURLSessionDataTask-Instanz die URL, die an sie übergeben wird. Durch Aufrufen von resume für die Datenaufgabe weisen Sie die NSURLSession-Instanz an, die Datenaufgabe zu ihrer Warteschlange hinzuzufügen.

Als Nächstes müssen Sie den Code hinzufügen, um die JokeModel-Instanzen zu initialisieren. Ersetzen // Daten hier behandeln durch:

arrayOfModelsFromData:error: Nimmt ein NSData-Objekt aus einer JSON-Antwort und gibt ein Array von Modellen zurück. Aber was passiert unter der Haube?

  1. [JokeModel arrayOfModelsFromData:error:] nimmt die JSON-Daten und wandelt sie in ein Array von JSON-Objekten um.
  2. Anschließend durchläuft JokeModel diese Objekte und erstellt aus jedem JSON-Objekt JokeModel-Instanzen.
  3. Jede JokeModel-Instanz überprüft die empfangenen JSON-Daten und initialisiert ihre Eigenschaften mit den richtigen Werten.
  4. Wenn die JokeModel-Instanz Inhalte im tags-Schlüssel der Daten findet, erstellt sie aus dem dem tags-Schlüssel zugeordneten Wert ein Array von TagModel-Instanzen.

Wenn Sie nur eine Modellinstanz erstellen müssen, müssen Sie initWithData: und initWithString: verwenden. Wir werden uns diese Methoden im nächsten Tutorial genauer ansehen.

Nach dem Initialisieren des Array von Witzen können Sie dem Benutzer den ersten Witz mithilfe des folgenden Codeausschnitts anzeigen.

Schritt 5: Witze anzeigen

Sie ziehen zuerst einen zufälligen Witz aus dem jokes-Array und speichern ihn im model. Wenn der Witz Tags enthält, speichern Sie diese als durch Kommas getrennte Liste in einer Variablen mit dem Namen tags. Wenn der Witz keine Tags enthält, setzen Sie die tags auf @"no tags".

Sie aktualisieren die Beschriftung, um die id, den text und die tags des aktuellen Witzes anzuzeigen, und verwenden eine Überblendungsanimation, um den Witz dem Benutzer anzuzeigen.

Wenn die Animation abgeschlossen ist, warten Sie fünf Sekunden, bevor Sie hideJoke aufrufen, wodurch der Witz mit einer weiteren Fade-Animation ausgeblendet wird. Wenn die Animation abgeschlossen ist, rufen Sie erneut showNextJoke auf.

Dadurch entsteht eine Endlosschleife, in der zufällig ausgewählte Witze ein- und ausgeblendet werden. Der Effekt ist ziemlich cool. Probieren Sie es aus, indem Sie die Anwendung ausführen.

Es besteht jedoch das Problem, dass beim Ausdrucken des Arrays von Tags TagModel-Objekte anstelle von Zeichenfolgenobjekten angezeigt werden. Dieses Verhalten ist tatsächlich eine Funktion der JSONModel-Bibliothek. Es wird automatisch eine Beschreibung des Objekts erstellt, wie Sie sie im vorherigen Screenshot gesehen haben. Es listet die Eigenschaften des Modellobjekts und ihre Werte auf, was beim Debuggen wirklich hilfreich ist.

Schritt 6: Anpassen von Modellen

Zum Abschluss dieses Tutorials schreiben Sie Ihre erste Zeile Modellcode. Modelle, die von JSONModel erben, sind wie jede andere Objective-C-Klasse. Dies bedeutet, dass Sie die Methoden von JSONModel überschreiben und ihr Verhalten nach Belieben anpassen können.

Öffnen Sie TagModel.m und überschreiben Sie die Standardbeschreibungsmethode:

Wenn Sie jetzt componentsJoinedBySeparator: aufrufen. Im Array von Tags wird anstelle der Standardbeschreibung von TagModel nur das Tag als einfacher Text angezeigt.

Probieren Sie es aus, indem Sie die Anwendung noch einmal ausführen. Sie sollten jetzt die Liste der Tags sehen, die ordentlich unter jedem Witz erscheinen.

Abschluss

Sie haben jetzt ein grundlegendes Verständnis der JSONModel-Bibliothek. Bisher haben Sie gelernt:

  • So erstellen Sie eine einfache Modellklasse, die von JSONModel erbt
  • wie man erforderliche und optionale Eigenschaften definiert
  • und wie man Modellklassen verschachtelt

In diesem kurzen Tutorial habe ich nur einige der Funktionen der JSONModel-Bibliothek angesprochen. In den nächsten Abschnitten dieser Serie erfahren Sie mehr über die Datentransformation, die Arbeit mit Remote-JSON-APIs und einige erweiterte JSONModel-Funktionen.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.