Ich habe eine JSON-Zeichenfolge (von PHPs, json_encode()
die so aussieht:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Ich möchte dies in eine Art Datenstruktur für meine iPhone-App analysieren. Ich denke, das Beste für mich wäre, ein Array von Wörterbüchern zu haben, also ist das 0. Element im Array ein Wörterbuch mit Schlüsseln "id" => "1"
und "name" => "Aaa"
.
Ich verstehe allerdings nicht, wie NSJSONSerialization
die Daten gespeichert werden. Hier ist mein Code bisher:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
Dies ist nur ein Beispiel, das ich auf einer anderen Website als Beispiel gesehen habe. Ich habe versucht, das JSON
Objekt zu lesen, indem ich die Anzahl der Elemente und ähnliches ausgedruckt habe, aber ich bekomme immer etwas EXC_BAD_ACCESS
.
Wie NSJSONSerialization
analysiere ich den oben genannten JSON und wandle ihn in die von mir erwähnte Datenstruktur um?
quelle
Antworten:
Ihr Root-JSON-Objekt ist kein Wörterbuch, sondern ein Array:
Dies könnte Ihnen ein klares Bild davon geben, wie Sie damit umgehen sollen:
quelle
[JSON count]
zurückgeben, anstatt mir nur EXC_BAD_ACCESS zu geben?!jsonArray
und den Fehler ausdrucken. Dies sollte alle Fehler anzeigen, die während des Parsens aufgetreten sind.jsonArray
sollte es autorelease sein.Dies ist mein Code, um zu überprüfen, ob der empfangene JSON ein Array oder ein Wörterbuch ist:
Ich habe dies für Optionen versucht: kNilOptions und NSJSONReadingMutableContainers und funktioniert für beide korrekt.
Offensichtlich kann der eigentliche Code nicht so sein, wie ich den NSArray- oder NSDictionary-Zeiger innerhalb des if-else-Blocks erstelle.
quelle
Für mich geht das. Ihr
data
Objekt ist wahrscheinlichnil
und, wie rckoenes bemerkt hat, sollte das Stammobjekt ein (veränderliches) Array sein. Siehe diesen Code:(Ich musste die Anführungszeichen in der JSON-Zeichenfolge mit Backslashes umgehen.)
quelle
Ihr Code scheint in Ordnung zu sein, außer dass das Ergebnis ein
NSArray
und keinNSDictionary
ist. Hier ein Beispiel:In den ersten beiden Zeilen wird nur ein Datenobjekt mit dem JSON erstellt, so wie Sie es aus dem Netz lesen würden.
NSLog-Inhalte (eine Liste von Wörterbüchern):
quelle
NSJSONReadingMutableLeaves
:: "Gibt an, dass Blattzeichenfolgen im JSON-Objektdiagramm als Instanzen von NSMutableString erstellt werden."NSJSONReadingMutableContainers
"Gibt an, dass Arrays und Wörterbücher als veränderbare Objekte erstellt werden."In den obigen JSON-Daten zeigen Sie, dass wir ein Array haben, das die Anzahl der Wörterbücher enthält.
Sie müssen diesen Code zum Parsen verwenden:
Für schnelles 3/3 +
quelle
Der folgende Code ruft ein JSON-Objekt von einem Webserver ab und analysiert es in ein NSDictionary. Ich habe die openweathermap-API verwendet, die für dieses Beispiel eine einfache JSON-Antwort zurückgibt. Zur Vereinfachung verwendet dieser Code synchrone Anforderungen.
quelle
@rckoenes hat Ihnen bereits gezeigt, wie Sie Ihre Daten korrekt aus der JSON-Zeichenfolge abrufen können.
Auf die Frage, die Sie gestellt haben:
EXC_BAD_ACCESS
Kommt fast immer, wenn Sie versuchen, auf ein Objekt zuzugreifen, nachdem es [automatisch] freigegeben wurde. Dies ist nicht spezifisch für die JSON [De-] Serialisierung, sondern hat nur damit zu tun, dass Sie ein Objekt abrufen und dann darauf zugreifen, nachdem es freigegeben wurde. Die Tatsache, dass es über JSON kam, spielt keine Rolle.Es gibt viele, viele Seiten, auf denen beschrieben wird, wie Sie dies debuggen können - Sie möchten Google (oder SO)
obj-c zombie objects
und insbesondereNSZombieEnabled
, was für Sie von unschätzbarem Wert ist, um die Quelle Ihrer Zombie-Objekte zu bestimmen. ("Zombie" heißt es, wenn Sie ein Objekt freigeben, aber einen Zeiger darauf behalten und später versuchen, darauf zu verweisen.)quelle
Swift 2.0 auf Xcode 7 (Beta) mit do / try / catch-Block:
quelle
HINWEIS: Für Swift 3 . Ihr JSON-String gibt Array anstelle von Dictionary zurück. Bitte probieren Sie Folgendes aus:
quelle
quelle
Das Problem scheint bei der automatischen Freigabe von Objekten zu liegen. NSJSONSerialization JSONObjectWithData erstellt offensichtlich einige automatisch freigegebene Objekte und gibt sie an Sie zurück. Wenn Sie versuchen, dies auf einen anderen Thread zu übertragen, funktioniert dies nicht, da die Zuordnung zu einem anderen Thread nicht aufgehoben werden kann.
Der Trick könnte darin bestehen, eine veränderbare Kopie dieses Wörterbuchs oder Arrays zu erstellen und es zu verwenden.
Die Behandlung eines NSDictionary als NSArray führt nicht zu einer Ausnahme für einen fehlerhaften Zugriff, sondern stürzt wahrscheinlich ab, wenn ein Methodenaufruf ausgeführt wird.
Möglicherweise sind die Optionen hier auch nicht wirklich wichtig, aber es ist besser, NSJSONReadingMutableContainers | anzugeben NSJSONReadingMutableContainers | NSJSONReadingAllowFragments, aber selbst wenn es sich um automatisch freigegebene Objekte handelt, kann dieses Problem möglicherweise nicht behoben werden.
quelle
schlechtes Beispiel sollte so etwas sein {"id": 1, "name": "etwas als Name"}
Nummer und Zeichenfolge werden gemischt.
quelle