Wie verwende ich NSJSONSerialization?
Habe ich ein JSON-string (aus der PHP - json_encode()
sieht wie folgt aus:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Möchte ich parse diese in eine Art von Datenstruktur, die für meine iPhone-app. Ich denke, das beste für mich wäre, um ein array von Wörterbüchern, so dass das 0. element im array ist ein dictionary mit den keys "id" => "1"
und "name" => "Aaa"
.
Ich verstehe nicht, wie die NSJSONSerialization
speichert die Daten aber. Hier ist mein code bisher:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
Dies ist nur etwas, das ich sah, wie ein Beispiel auf einer anderen website. Ich habe versucht, Sie zu erhalten gelesen auf der JSON
Objekt durch den Druck, die Anzahl der Elemente und Dinge wie das, aber ich bin immer EXC_BAD_ACCESS
.
Wie verwende ich NSJSONSerialization
zum Parsen der JSON oben, und drehen Sie ihn in die Daten-Struktur, die ich erwähnt?
InformationsquelleAutor der Frage Logan Serman | 2011-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Wurzel json-Objekt ist nicht ein Wörterbuch, sondern ein array:
Diese könnte Ihnen ein klares Bild davon, wie es zu handhaben:
InformationsquelleAutor der Antwort rckoenes
Dies ist mein code für die überprüfung, ob die empfangene json ein array oder dictionary:
Ich habe versucht, diese für Optionen:kNilOptions und NSJSONReadingMutableContainers und funktioniert richtig für beide.
Offensichtlich der eigentliche code kann nicht so sein, wo ich das NSArray oder NSDictionary Zeiger innerhalb der if-else-block.
InformationsquelleAutor der Antwort srik
Es funktioniert für mich. Ihre
data
Objekt wahrscheinlichnil
und, wie rckoenes festgestellt, das root-Objekt werden sollte (veränderlich) - array. Sehen Sie diesen code:(Ich hatte zu entkommen die Zitate in den JSON-string mit backslashes.)
InformationsquelleAutor der Antwort Ole Begemann
Dein code scheint in Ordnung, außer das Ergebnis ist ein
NSArray
, nicht einNSDictionary
hier ein Beispiel:Den ersten zwei Zeilen erzeugt nur ein Daten-Objekt mit der JSON, das gleiche wie du bekommen würde, es zu Lesen, aus dem Netz.
NSLog Inhalt (eine Liste von dictionaries):
InformationsquelleAutor der Antwort zaph
In der oben genannten JSON-Daten, die Sie zeigen, haben wir ein array contaning die Anzahl der Wörterbücher.
Müssen Sie diesen code verwenden für das parsing:
Für swift 3/3+
InformationsquelleAutor der Antwort kamalesh kumar yadav
Folgende code ruft ein JSON-Objekt von einem webserver, und analysiert Sie, um ein NSDictionary. Ich habe die openweathermap API gibt eine einfache JSON-Antwort für dieses Beispiel. Für die es einfach zu halten, wird dieser code verwendet synchrone Anfragen.
InformationsquelleAutor der Antwort mahesh chowdary
@rckoenes bereits zeigte, wie man richtig bekommen Sie Ihre Daten aus dem JSON-string.
Zu der Frage, die Sie fragte:
EXC_BAD_ACCESS
kommt fast immer, wenn Sie versuchen auf ein Objekt zuzugreifen, nachdem es gewesen ist, [auto-]veröffentlicht. Dies ist nicht auf eine bestimmte JSON - [de-]Serialisierung, sondern nur mit dem zu tun hat, dass Sie immer ein Objekt und dann auf es zu nach es veröffentlicht wurde. Die Tatsache, dass Sie kam über JSON egal.Gibt es viele-viele Seiten, die beschreiben, wie man debug-Sie wollen Google (oder SO)
obj-c zombie objects
und insbesondereNSZombieEnabled
, die als wertvoll erweisen wird Ihnen helfen, festzustellen, die Quelle der zombie-Objekte. ("Zombie" ist, was es heißt, wenn Sie ein Objekt freigeben, sondern halten einen Zeiger auf Sie und versuchen, die Referenz später.)InformationsquelleAutor der Antwort Olie
Swift 2.0 auf Xcode 7 (Beta) mit do/try/catch-block:
InformationsquelleAutor der Antwort Zorayr
HINWEIS: Für Swift 3.
Ihre JSON-String zurück-Array anstelle von Wörterbuch. Bitte probieren Sie die folgenden:
InformationsquelleAutor der Antwort Microprocessor8085
InformationsquelleAutor der Antwort deepa
Das Problem scheint zu sein, die mit autorelease von Objekten. NSJSONSerialization JSONObjectWithData ist natürlich die Schaffung von etwas autoreleased Objekte und übergeben Sie es an Sie zurück. Wenn Sie versuchen, auf einen anderen thread, es wird nicht funktionieren, da es nicht freigegeben ist, in einem anderen thread.
Trick könnte sein, zu versuchen zu tun, eine veränderbare Kopie des dictionary-oder array und verwenden Sie es.
Behandlung eines NSDictionary als NSArray kein Ergebnis in Bad access Ausnahme, sondern wird wahrscheinlich Abstürzen, wenn eine Methode aufgerufen wird.
Außerdem kann die Optionen nicht wirklich wichtig hier, aber es ist besser zu geben, NSJSONReadingMutableContainers | NSJSONReadingMutableContainers |
NSJSONReadingAllowFragments aber auch wenn Sie autoreleased Objekte es kann nicht das Problem lösen.
InformationsquelleAutor der Antwort Deepak G M