2011-12-27 1 views
1

J'ai créé un service WCF, qui fournit la réponse suivante à mon opération POST:NSJSONSerialization données de réponse parsing

"[{\"Id\":1,\"Name\":\"Michael\"},{\"Id\":2,\"Name\":\"John\"}]" 

Mon appel à JSONObjectWithData, ne renvoie pas d'erreur, mais je ne peux pas énumérer sur la résultats, qu'est-ce que je fais mal?

NSError *jsonParsingError = nil; 
NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError]; 

NSLog(@"jsonList: %@", jsonArray); 

if(!jsonArray) 
{ 
    NSLog(@"Error parsing JSON:%@", jsonParsingError); 
} 
else 
{ 
    // Exception thrown here.   
    for(NSDictionary *item in jsonArray) 
    { 
     NSLog(@"%@", item); 
    } 
} 
+0

Quel type d'exception est levée? –

+0

Est-ce que votre NSLog génère quelque chose à partir de jsonArray? – Jeremy

+0

@ Jacob-Relkin - L'exception est: EXC_BAD_INSTRUCTION – mservidio

Répondre

3

Comme le souligne Jeremy, vous ne devrait pas échapper aux citations dans les données JSON. Mais aussi, vous avez cité la chaîne de retour. Cela en fait une chaîne JSON, pas un objet, donc quand vous le décodez, vous avez une chaîne, pas un tableau mutable, ce qui explique pourquoi vous obtenez une erreur lorsque vous essayez d'itérer rapidement ... vous n'êtes pas en mesure de parcourir rapidement sur une chaîne.

Votre JSON devrait ressembler à: [{"Id":1,"Name":"Michael"},{"Id":2,"Name":"John"}]. Pas de citations, pas d'échappées. Une fois que vous avez supprimé les guillemets autour de votre objet JSON, votre application ne tombera plus en panne, mais vous obtiendrez une erreur de désérialisation JSON pour les données malformées (les échappements).

+0

merci Jason. C'était ça. J'ai réalisé que j'avais mal codé mon service WCF. Au lieu de mon type de retour étant une chaîne, qui était, il devrait être un List <>, et juste le ResponseFormat devrait être json, et le reste prend soin de lui-même. Parce que j'ai renvoyé une chaîne réelle, tout a été échappé, et toute la chaîne a été citée. – mservidio

3

La cause probable est que vous utilisez un objet de base incorrect. Essayez de remplacer NSMutableArray par NSDictonary.

De:

NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError]; 

Pour:

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError]; 
+0

Juste essayé, que maintenant je reçois une erreur SIGABRT au même endroit ... – mservidio

+0

Désolé, ma réponse supposait que vous n'obteniez pas une exception. Mais, puisque vous avez déclaré que vous avez reçu une exception dans un commentaire ci-dessus, il est très probable que votre json soit mal formé. Votre réponse ne devrait pas réellement être l'envoi d'évasions. – Jeremy

+0

Merci d'avoir signalé cela. Ma sortie de fiddler est "[{\" Id \ ": 1, \" Nom \ ": \" Michael \ "}, {\" Id \ ": 2, \" Nom \ ": \" John \ "} ] ", qui a des échappées. Je mettrai à jour mon service wcf afin qu'il n'échappe pas à la réponse. – mservidio

0

L'analyse avec NSJSONSerialization est facile, mais j'ai également créé un petit framework qui permet d'analyser les valeurs JSON directement dans les objets de classe, au lieu de traiter les dictionnaires. Jetez un oeil, il pourrait être utile: https://github.com/mobiletoly/icjson