158 votes

Comment utiliser NSJSONSerialization

J'ai une chaîne JSON (à partir de PHP json_encode() qui ressemble à ceci:

[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]

Je veux analyser ce dans une sorte de structure de données pour mon iPhone. Je suppose que la meilleure chose pour moi serait d'avoir un tableau de dictionnaires, de sorte que le 0e élément du tableau est un dictionnaire avec les touches "id" => "1" et "name" => "Aaa".

Je ne comprends pas comment le NSJSONSerialization 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 un exemple sur un autre site. J'ai essayé d'obtenir une lecture sur le JSON objet par l'impression, le nombre des éléments et des choses comme ça, mais je suis toujours EXC_BAD_ACCESS.

Comment puis-je utiliser NSJSONSerialization de parser le JSON ci-dessus, et de le transformer dans la structure de données que j'ai citées?

217voto

rckoenes Points 44278

Votre objet racine json n'est pas un dictionnaire mais un tableau:

 [{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
 

Cela pourrait vous donner une image claire de la façon de le gérer:

 NSError *e = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e];

if (!jsonArray) {
  NSLog(@"Error parsing JSON: %@", e);
} else {
   for(NSDictionary *item in jsonArray) {
      NSLog(@"Item: %@", item);
   }
}
 

76voto

srik Points 696

Ceci est mon code pour vérifier si le json reçu est un tableau ou un dictionnaire:

 NSError *jsonError = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&jsonError];

if ([jsonObject isKindOfClass:[NSArray class]]) {
    NSLog(@"its an array!");
    NSArray *jsonArray = (NSArray *)jsonObject;
    NSLog(@"jsonArray - %@",jsonArray);
}
else {
    NSLog(@"its probably a dictionary");
    NSDictionary *jsonDictionary = (NSDictionary *)jsonObject;
    NSLog(@"jsonDictionary - %@",jsonDictionary);
}
 

Je l'ai essayé 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 manière où je crée le pointeur NSArray ou NSDictionary dans le bloc if-else.

30voto

Ole Begemann Points 85798

Ça marche pour moi. Votre objet data est probablement nil et, comme cela a été noté, l 'objet racine doit être un tableau (mutable). Voir ce code:

 NSString *jsonString = @"[{\"id\": \"1\", \"name\":\"Aaa\"}, {\"id\": \"2\", \"name\":\"Bbb\"}]";
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *e = nil;
NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&e];
NSLog(@"%@", json);
 

(J'ai dû échapper les guillemets dans la chaîne JSON avec des barres obliques inverses.)

9voto

Zaph Points 40557

Votre code semble correct, sauf que le résultat est un NSArray , pas un NSDictionary , voici un exemple:

Les deux premières lignes ne font que créer un objet de données avec le JSON, comme vous le feriez en le lisant sur le net.

 NSString *jsonString = @"[{\"id\": \"1\", \"name\":\"Aaa\"}, {\"id\": \"2\", \"name\":\"Bbb\"}]";
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSError *e;
NSMutableArray *jsonList = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&e];
NSLog(@"jsonList: %@", jsonList);
 

Contenu de NSLog (une liste de dictionnaires):

 jsonList: (
           {
               id = 1;
               name = Aaa;
           },
           {
               id = 2;
               name = Bbb;
           }
           )
 

6voto

 [{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
 

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:

 NSError *e = nil;
NSArray *JSONarray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e];
        for(int i=0;i<[JSONarray count];i++)
        {
            NSLog(@"%@",[[JSONarray objectAtIndex:i]objectForKey:@"id"]);
             NSLog(@"%@",[[JSONarray objectAtIndex:i]objectForKey:@"name"]);
        }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X