2012-10-03 4 views
1

Je me suis cogné la tête contre un mur pour un peu.iOS Parsing JSON Woes

J'ai un back-end de rails qui retourne JSON à mon application iOS. J'utilise le retour par défaut des rails pour rendre automatiquement mon objet en JSON. J'ai des problèmes avec les erreurs qu'il renvoie.

Le JSON obtenu pour les erreurs est {"errors":{"email":["can't be blank"],"password":["can't be blank"]}}. J'utilise ASI pour gérer la demande.

-(void) requestFinished:(ASIFormDataRequest *)request { 
    NSDictionary *data = [[request responseString] JSONValue]; 

Faire le code ci-dessus font les données deviennent:

{ 
    errors =  
    { 
    email =   (
     "can't be blank" 
    ); 
    password =   (
     "can't be blank" 
    ); 
    }; 
} 

Maintenant, cela me donne pour analyser les questions en essayant dehors. J'aimerais pouvoir accéder à chaque élément d'erreur et à sa valeur associée.

Lorsque je tente de boucle à travers les éléments, je fais quelque chose comme:

for (NSDictionary *error in [data objectForKey:@"errors"]) 

Cela me donnera email et password, mais ils sont de type __NSCFString, pas NSDictionary. Je n'ai pas été en mesure de trouver un moyen d'obtenir la valeur de l'email ou du mot de passe. Est-ce que quelqu'un a une idée sur la façon d'analyser cela?

Merci!

Répondre

1

Cela devrait fonctionner, notez que la réponse a la même structure que votre NSDictionary 'data'.

NSDictionary *fields = [[NSDictionary alloc] initWithObjectsAndKeys: [[NSArray alloc] initWithObjects:@"one", @"two", nil], 
                   @"A", 
                   [[NSArray alloc] initWithObjects:@"three", @"four", nil], 
                   @"B", 
                   nil]; 

NSDictionary *response = [[NSDictionary alloc] initWithObjectsAndKeys:fields, @"errors", nil]; 

NSLog(@"Dictionary: %@", [response objectForKey:@"errors"]); 


for (NSString *field in [response objectForKey:@"errors"]) 
    for (NSString* error in [response valueForKeyPath:[NSString stringWithFormat:@"errors.%@", field]]) 
     NSLog(@"%@ %@", field, error); 

La sortie ressemblera à ceci:

Dictionary: { 
A =  (
    one, 
    two 
); 
B =  (
    three, 
    four 
); 
} 

A one 
A two 
B three 
B four 
1

Eh bien, je n'ai pas Mac en ce moment mais j'essaie de vous aider si cela ne fonctionne pas laissez-moi savoir que je vais le corriger demain.

-(void) requestFinished:(ASIFormDataRequest *)request 
{ 
    NSArray *data = [[request responseString] JSONValue]; 
    NSDictionary *dict = [data objectAtIndex:0]; 

    NSDictionary *dict2 = [dict valueForKey:@"errors"]; 

    NSLog(@"email = %@, password = %@",[dict2 valueForKey:@"email"], [dict2 valueForKey:@"password"]); 
} 
+0

Merci d'avoir essayé sans votre Mac à portée de main. Malheureusement, cela ne fonctionnera pas en utilisant un NSArray. La réponse acceptée fonctionne bien, mais elle semble être valueForKeyPath. – LyricalPanda

+0

D'accord, félicitations! Je suis heureux que votre problème a été résolu. – TheTiger