(Réglé) Ajouter une donnée dans un tableau à partir de JSON
Ben77650
Membre
Bonjour à tous,
Je suis débutant en Objective-C et je suis confronté à un problème pour afficher les données JSON dans un tableau
Vous trouverez mon code en dessous
-(NSMutableArray*)getAll{
NSMutableArray* liste;
dispatch_queue_t downloadQueue = dispatch_queue_create("Get All Offers", NULL);
dispatch_async(downloadQueue, ^{
NSData *result = [self executePostCall];
dispatch_async(dispatch_get_main_queue(), ^{
id strResult=nil;
NSError* error;
strResult = [NSJSONSerialization JSONObjectWithData:result options:0 error:&error];
//NSLog(@strResult: %@", strResult);
NSLog(@strResult: %@",[[strResult objectAtIndex:0] objectForKey:@id]);
// retourne strResult: 1496
for(int cpt=0; cpt>[strResult count];cpt++)
{
[liste addObject:[NSMutableArray new]];
// ERREUR ICI !!!!!!!!!
[[liste objectAtIndex:cpt] addObject:[[NSString alloc] initWithFormat:@%@",[[[strResult objectForKey:@titre]objectAtIndex:cpt] objectForKey:@titre]]];
[[liste objectAtIndex:cpt] addObject:[[NSString alloc] initWithFormat:@%@",[[[strResult objectForKey:@srcImage]objectAtIndex:cpt] objectForKey:@srcImage]]];
[[liste objectAtIndex:cpt] addObject:[[NSString alloc] initWithFormat:@%@",[[[strResult objectForKey:@date]objectAtIndex:cpt] objectForKey:@date]]];
[[liste objectAtIndex:cpt] addObject:[[NSString alloc] initWithFormat:@%@",[[[strResult objectForKey:@prix]objectAtIndex:cpt] objectForKey:@prix]]];
[[liste objectAtIndex:cpt] addObject:[[NSString alloc] initWithFormat:@%@",[[[strResult objectForKey:@ville]objectAtIndex:cpt] objectForKey:@ville]]];
[[liste objectAtIndex:cpt] addObject:[[NSString alloc] initWithFormat:@%@",[[[strResult objectForKey:@categorie]objectAtIndex:cpt] objectForKey:@categorie]]];
}
});
});
NSLog(@liste: %@",liste);
return liste;
// retourne null
}
[self executePostCall] est une autre fonction mais qui marche bien. Si besoin est je peut vous l'envoyer (ainsi que le script php) mais je pense vraiment pas que le souci vienne de la.
La variable strResult me renvoie cela
strResult:
{
cat = 46;
id = 1496;
}
Je pense que le problème viens de ma première clé, mais je ne sais que mettre (j'ai testé "id", "", " ", nil, la 2e clé) mais à chaque fois il me renvoie liste: nul
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu t'es trompé dans la condition de validité de ta boucle
au lieu de
à‰vite d'envoyer de fausses pistes...
Quand tu fais ton log de strResult, déjà , tu fais un log de strResult[0];
ça m'a mis sur la mauvaise piste en lisant le log, j'ai cru que ta réponse était un NSDictionary et non pas un NSArray.
Ensuite, ajouter un NSMutableArray vide dans ta liste object, c'est bizarre...
Plutôt que d'ajouter directement, testes ce que tu mets : Logs les [strResult objectForKey:@"titre"]objectAtIndex:cpt] objectForKey:@"titre"]
Sinon, merci de te présenter dans la section adéquate, et rebonjour (SO).
@colas: Merci effectivement déjà c'était une erreur que je n'avais pas vu, mais avant ça marchais, la cela crashe complétement
@Larme: re, la présentation c'est bon c'est ok
Quand je fais
Ca ne s'affiche pas
Merci en tout cas à vous 2 d'essayer de m'aider
Tu pourrais nous montrer NSLog(@strResult: %@", strResult);?
Tout du moins les clés que tu utilises, et mettre XxX ou autre truc bidon en valeur.
Ah, et merci d'utiliser la balise code.
Je l'avais fait sur SO
Oui, mais là , je ne vois pas d'itération possible en fait.
Et quand tu dis que cela ne s'affiche pas, tu veux dire que tu as "test: null" ou rien du tout ? Si tu n'as rien du tout, c'est que cela ne passe pas dans ta boucle. Auquel cas, comme je l'ai dis juste avant, je ne vois pas d'itération à faire. Enfin, je ne sais pas à quel moment/quel niveau la faire.
Je veut dire que j'ai absolument rien du tout, après c'est peut être normal qu'il rentre pas dans la condition, vu que cpt n'est jamais supérieur a 20 ([strResult count]).
Après si je met <20 (et non >20), il me quitte l'application brutalement en me disant
Tu fais un objectForKey: (truc typique NSDictionary) sur un NSArray.
Donc ça plante.
Pour moi, je pense que tu n'as pas compris comment est structuré ton JSON.
Bah j'ai bien compris que ma variable strResult était de type id.
Après c'est vrai que si tu as quelques explications je suis preneur, comme je l'ai dit je débute, donc de l'aide ne serait pas de refus.
Tu utilises simultanément
et
Donc, faut savoir ! C'est un NSArray ou un NSDictionary !!!
Le type de ton objet est celui retourné par la méthode [NSJSONSerialization JSONObjectWithData:result options:0 error:&error];
Dire que c'est un id ne veut pas dire que ton objet n'a pas de type.
Cela veut juste dire que le compilateur ne sait pas quel est son type.
• dico = {
cle1 = valD1,
cle2 = valD2,
}
=> NSDictionnary, récupération de valD1 via [dico objectForKey:@cle1]
valD2 = [dico objectForKey:@cle2];
• array = (
valA1,
vaA2,
)
=> NSArray, récupération de valA1 par [array objectAtIndex:0].
valA2 = [array objectAtIndex:1];
• Maintenant, tu peux avoir des Dictionnaires dans un Array (exemple valD1 est un array, des Arrays dans des Dictionnaires (exemple valA2 est un dictionnaire).
Quand on ne maà®trise pas, il faut y aller petit à petit.
Tu auras peut-être besoin de caster : NSDictionary *valD1 = (NSDictionary *)[dico objectForKey:@cle1].
Donc je te conseille d'utiliser des valeurs temp, de regarder niveau par niveau, de ne pas hésiter à les Logs. Regarde donc ce qui est au premier niveau de strResult. Etc.
Pour faire claire concernant ce que me renvoie strResult:
Sinon du coup quelqu'un sait il me dire pourquoi ça plante quand je fais
J'avoue ne pas comprendre car quand je fais
il m'affiche bel et bien 20
Sinon, normalement, cela devrait marcher :
ou
Tu vois, que déjà , lorsque tu avais écrit la première fois à quoi ressemblait ton strResult, moi, j'y voyais un dictionnaire. Alors qu'en réalité, c'est un array de dictionnaires.
Bon effectivement ça fonctionne ainsi (1ere option), donc c'est une bonne chose, et une sacrée avancée.
J'aimerais ajouter toutes les infos dans un NSMutableArray et pourra le renvoyer à la fin donc saurais tu m'éclairer sur la manière de faire s'il te plait ?
C'est étrange de ranger ça dans un NSArray (j'ai cru comprendre de ton code que tu veux un NSArray de NSArray) plutôt que de garder une forme telle quelle : NSArray de NSDictionary. Disons que de mon point de vue externe, ce n'est pas pertinent.
Du coup, en reprenant ton code :
Par contre, l'ordre n'est pas définit (cf. doc sur allValues). Je ne suis pas sûr qu'ils soient tous dans le même ordre, ou dans l'ordre que tu souhaites...
Je ne sais pas si tu comptes garder toutes les données, mais si tu veux garder un certain ordre :
Bah à vrai dire le tableau (au lieu du dictionnaire) je pense que c'est la solution la plus simple (enfin celle que je maitrise le mieux) après si le dictionnary est plus simple d'utilisation et mieux pourquoi pas changer, comme on dit il y a que les imbéciles qui changent pas d'avis ^^
A vrai dire je ne veut pas garder toutes les infos récupérées, je veut juste sur mon écran actuel en afficher 6 d'entre elles (titre, srcImage, date, prix, ville, catégorie)
Le souci c'est que liste
quand je fais un Log à la fin avant de le retourner, ça me renvoie toujours null
Et quand je met
voila mon retour: liste: (
)
Ton soucis vient du fait que tu fais de l'asynchrone.
En bref, normalement, les actions s'enchaà®nent une fois que la précédente est terminée. Ce n'est pas le cas ici (async).
Du coup, tu lui dis : Récupère les données et parses-les pendant ce temps-là , et l'appel du NSLog de liste arrive avant que cela ne soit fait.
Bah voila la fonction complète:
Je ne vois pas ou mettre ailleurs les 2 dernières lignes, car sinon ça me met une erreur.
Je ne vois pas où ça bugue, mais tu as oublié de réinitialiser ton arrayTemp.
Fais plutôt
Ok merci cela règle un problème que j'avais (il m'affichais 3 offres à 20 reprises)
Merci à ceux qui m'ont aidés (Larme et colas2)