J'ai une chaîne JSON (de PHP json_encode()
qui ressemble à ceci:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Je veux analyser cela dans une sorte de structure de données pour mon application iPhone. Je suppose que la meilleure chose pour moi serait d'avoir un tableau de dictionnaires, donc le 0ème élément du tableau est un dictionnaire avec les clés "id" => "1"
et "name" => "Aaa"
.
NSJSONSerialization
Cependant, je ne comprends pas comment le stocke les données. Voici mon code pour l'instant:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
C'est juste quelque chose que j'ai vu comme exemple sur un autre site Web. J'ai essayé de lire l' JSON
objet en imprimant le nombre d'éléments et de choses comme ça, mais je reçois toujours EXC_BAD_ACCESS
.
Comment puis-je utiliser NSJSONSerialization
pour analyser le JSON ci-dessus et le transformer en la structure de données que j'ai mentionnée?
la source
Réponses:
Votre objet json racine n'est pas un dictionnaire mais un tableau:
Cela pourrait vous donner une idée claire de la façon de le gérer:
la source
[JSON count]
retourner quelque chose au lieu de me donner simplement EXC_BAD_ACCESS?!jsonArray
et imprimé l'erreur. Cela devrait afficher toute erreur survenue lors de l'analyse.jsonArray
il devrait être autorelease.C'est mon code pour vérifier si le json reçu est un tableau ou un dictionnaire:
J'ai essayé ceci pour les options: kNilOptions et NSJSONReadingMutableContainers et fonctionne correctement pour les deux.
De toute évidence, le code réel ne peut pas être de cette façon où je crée le pointeur NSArray ou NSDictionary dans le bloc if-else.
la source
Ça marche pour moi. Votre
data
objet est probablementnil
et, comme l'a noté rckoenes, l'objet racine devrait être un tableau (mutable). Voir ce code:(J'ai dû échapper aux guillemets dans la chaîne JSON avec des barres obliques inverses.)
la source
Votre code semble correct sauf que le résultat est un
NSArray
, pas unNSDictionary
, voici un exemple:Les deux premières lignes créent simplement un objet de données avec le JSON, comme vous le feriez en le lisant sur le net.
Contenu NSLog (une liste de dictionnaires):
la source
NSJSONReadingMutableLeaves
"Spécifie que les chaînes feuille dans le graphique d'objets JSON sont créées en tant qu'instances de NSMutableString."NSJSONReadingMutableContainers
: "Spécifie que les tableaux et les dictionnaires sont créés en tant qu'objets mutables."Dans les données JSON ci-dessus, vous montrez que nous avons un tableau contenant le nombre de dictionnaires.
Vous devez utiliser ce code pour l'analyser:
Pour swift 3/3 +
la source
Le code suivant récupère un objet JSON à partir d'un serveur Web et l'analyse en NSDictionary. J'ai utilisé l'API openweathermap qui renvoie une réponse JSON simple pour cet exemple. Pour rester simple, ce code utilise des requêtes synchrones.
la source
@rckoenes vous a déjà montré comment obtenir correctement vos données à partir de la chaîne JSON.
À la question que vous avez posée:
EXC_BAD_ACCESS
vient presque toujours lorsque vous essayez d'accéder à un objet après qu'il a été [auto-] libéré. Ce n'est pas spécifique à la [dé-] sérialisation JSON mais, plutôt, cela a juste à voir avec vous obtenir un objet et y accéder ensuite après sa publication. Le fait qu'il soit venu via JSON n'a pas d'importance.Il existe de nombreuses pages décrivant comment déboguer cela - vous voulez Google (ou SO)
obj-c zombie objects
et, en particulierNSZombieEnabled
, qui se révélera inestimable pour vous aider à déterminer la source de vos objets zombies. ("Zombie" est ce qu'il appelle lorsque vous relâchez un objet mais que vous gardez un pointeur dessus et que vous essayez de le référencer plus tard.)la source
Swift 2.0 sur Xcode 7 (Beta) avec bloc do / try / catch:
la source
REMARQUE: pour Swift 3 . Votre chaîne JSON renvoie Array au lieu de Dictionary. Veuillez essayer ce qui suit:
la source
la source
Le problème semble être lié à la libération automatique des objets. NSJSONSerialization JSONObjectWithData crée évidemment des objets libérés automatiquement et vous les renvoie. Si vous essayez de transférer cela sur un thread différent, cela ne fonctionnera pas car il ne peut pas être désalloué sur un thread différent.
L'astuce pourrait être d'essayer de faire une copie modifiable de ce dictionnaire ou de ce tableau et de l'utiliser.
Traiter un NSDictionary comme NSArray n'entraînera pas d'exception d'accès incorrect, mais au lieu de cela, il plantera probablement lorsqu'un appel de méthode est effectué.
De plus, les options n'ont peut-être pas vraiment d'importance ici, mais il est préférable de donner NSJSONReadingMutableContainers | NSJSONReadingMutableContainers | NSJSONReadingAllowFragments, mais même s'il s'agit d'objets libérés automatiquement, il se peut que ce problème ne soit pas résolu.
la source
mauvais exemple, devrait être quelque chose comme ceci {"id": 1, "name": "something as name"}
nombre et chaîne sont mélangés.
la source