2010-09-21 5 views
1

J'ai une application iPhone qui obtient une chaîne json d'un serveur et l'analyse. Il contient des données et, par exemple. un tableau de commentaires. Mais je l'ai remarqué que l'ordre du tableau JSON est pas conservée quand je parse comme ceci:Objective-C SBJSON: ordre de json array

// parse response as json 
SBJSON *jsonParser = [SBJSON new]; 
NSDictionary *jsonData = [jsonParser objectWithString:jsonResponse error:nil]; 

NSDictionary* tmpDict = [jsonData objectForKey:@"rows"]; 
NSLog(@"keys coming!"); 
NSArray* keys = [tmpDict allKeys]; 
for (int i = 0;i< [keys count]; i++) { 
    NSLog([keys objectAtIndex:i]); 
} 

Structure Json:

{ 
   "pagerInfo":{ 

      "page":"1", 

      "rowsPerPage":15, 

      "rowsCount":"100" 

   }, 

   "rows":{ 

      "18545":{ 

         "id":"18545", 

         "text":"comment 1" 

      }, 

      "22464":{ 

         "id":"22464", 

         "text":"comment 2" 

      }, 

      "21069":{ 

         "id":"21069", 

         "text":"comment 3" 

      }, 

… more items 

   } 

} 

Est-ce que quelqu'un sait comment faire face à ce problème ? Merci beaucoup!

Répondre

3

Dans votre exemple JSON, il n'y a pas de tableau mais un dictionnaire. Et dans un dictionnaire, les clés ne sont par définition pas ordonnées. Donc, vous devez soit modifier le code qui génère le JSON vraiment utiliser un tableau ou trier le tableau de clés dans votre code de cacao, peut-être comme ceci:

NSArray *keys = [[tmpDict allKeys] sortedArrayUsingSelector: @selector(compare:)]; 

En utilisant ce tableau de clés triées vous pouvez alors créer un nouveau tableau avec les objets dans l'ordre correct:

NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]]; 
for (NSString *key in keys) { 
    [array addObject: [tmpDict objectForKey: key]]; 
} 
+0

Merci, donc les identifiants dans ce json doivent être commandés pour résoudre ce problème? Est-il possible de l'analyser pour que [arrayAfterSomeGreatFunction objectAtIndex: 0] renvoie la chaîne "comment 1"? – Cocoprogrmr

+0

J'ai édité ma réponse pour vous montrer une façon possible de créer un nouveau tableau avec les objets triés. – Sven

0

Cocoprogrmr,

Voici ce que vous devez faire: après avoir analysé votre chaîne JSON et chargé que dans un NSArray (là où vous avez NSArray * touches écrit ci-dessus), à partir de là, vous pouvez mettre cela dans un pour boucle où vous itérez sur les valeurs dans votre touches tableau. Ensuite, pour obtenir vos valeurs imbriquées, par exemple, pour obtenir les valeurs des lignes/texte, utilisez la syntaxe comme ce qui suit:

for (NSDictionary *myKey in keys) 
{ 
    NSLog(@"rows/text --> %@", [[myKey objectForKey:@"rows"] objectForKey:@"text"]); 
} 

Cela devrait le faire. Ma syntaxe n'est peut-être pas parfaite, mais vous avez l'idée.

Andy