problème de récupération des données à  partir de JSON

Bonjour,



J'ai un petit souci avec le JSON.

les données ne sont pas récupérées.j'obtiens null lors de

l'affichage.

voici un aperçu de mon code :


<br />
NSDictionary *json    = [myJSON JSONValue];<br />
<br />
NSArray *listinfo    =  [json objectForKey:@&quot;info&quot;];<br />
info *infor = [[info alloc] init];<br />
<br />
for (NSDictionary *dic in listinfo) {<br />
<br />
  infor.business = [dic objectForKey:@&quot;Business&quot;];<br />
  NSLog(@&quot;%@&quot;,infor.business);<br />
}<br />
<br />
lblbu.text  =  [NSString stringWithFormat:@&quot;%@ - %d&quot;,infor.business];<br />
[info  release];<br />

Réponses

  • psychoh13psychoh13 Mothership Developer Membre
    Quelle version minimum de iOS cibles-tu?

    Si le minimum c'est 5.0 je te conseille d'utiliser NSJSONSerialization à  la place.



    Aussi, donne le JSON que tu parses.



    Au passage, je te conseille fortement de respecter les conventions de nommage, il faut que tes noms de classes commencent par une majuscule et préférablement par ton préfix personnel.
  • Oui merci pour le conseil.

    J'ai essayé ce bout de code pour localiser la source du problème,et j'ai constaté que les données sont récupérées dans la console mais l'affichage reste null
    <br />
    NSString * a = [NSString stringWithFormat:@&quot;%@&quot;,infor.business];<br />
    	   <br />
    	    NSLog(@&quot;%@&quot;,a);<br />
    	    lblbu.text = a;<br />
    	   <br />
    	    NSLog(@&quot;%@&quot;,lblbu.text);<br />
    
  • psychoh13psychoh13 Mothership Developer Membre
    (null) ou <null> ? Et aussi quelle ligne est null ? Quand tu mets un NSLog() mets un commentaire à  côté indiquant le résultat dans la console.



    Si c'est lblbu.text (utilise des noms plus explicites) alors je suspecte que c'est lvlby qui est nil, auquel cas à  mon avis tu essayes de passer une valeur à  un IBOutlet qui n'est pas encore charger en mémoire.
  • NSLog de lblb, c'est possible ?
  • Voici le code en entier :


    <br />
    <br />
    info *infor = [[info alloc] init];<br />
    <br />
    for (NSDictionary *dic in listinfo) {<br />
     <br />
    //création d&#39;un objet info<br />
     <br />
     <br />
      infor.business = [dic objectForKey:@&quot;business&quot;];<br />
     <br />
      lblbu.text  =  [NSString stringWithFormat:@&quot;%@ &quot;,infor.business];<br />
      NSLog(@&quot;%@&quot;,lblbu.text);<br />
     <br />
    }<br />
    	    [info  release];<br />
    




    le log :


    <br />
    2012-08-23 04:40:49.524 essaie[3322:207] (null)<br />
    (gdb) continue<br />
    2012-08-23 04:40:55.040 essaie[3322:207]  UNIT -B<br />
    
  • psychoh13psychoh13 Mothership Developer Membre
    Selon moi c'est ce que je t'ai dit, lblbu est nil, si c'est un IBOutlet il ne sera alloué que lorsque la vue de ton UIViewController sera charger.
  • Donc je dois changer l'emplacement ?
  • psychoh13psychoh13 Mothership Developer Membre
    Tu dois sûrement changer le moment où tu fais "lblbu.text = [NSString stringWithFormat:@%@ ",infor.business];" étant donné que cet objet n'existe pas encore. Tu peux l'assigner dans viewDidLoad. Sachant que tu dois aussi le faire dans ton setter et dans n'importe quel endroit où les données pourraient être recharger.
  • il sont déjà  mis dans la méthode viewDidLoad et j'ai déclaré les "property".

    C'est pourquoi ça me semble étrange d'avoir un (null) à  la fin
  • psychoh13psychoh13 Mothership Developer Membre
    Si tu as un nil c'est parce que ce code est exécuté avant que viewDidLoad le soit, enfin disons que tu n'as pas forcément donné suffisamment de code et que tu nous as pas montrer si la variable "lblbu" était null ou pas.



    Le problème peut aussi venir du JSON lui-même, tu dois le montrer aussi.



    Et habitue-toi à  tester tous ces paramètres.
  • voici mon JSON
    <br />
    {<br />
      &quot;info&quot; :[<br />
    	 <br />
    	    {&quot;resource&quot;: &quot;resource&quot;},<br />
    	    {&quot;business&quot;:&quot;  UNIT -B&quot;},<br />
    	    {&quot;service&quot;: &quot;service&quot;},<br />
    	    {&quot;responsable&quot;: &quot;resp1&quot;},<br />
    	    {&quot;nbrHeure&quot;: &quot;30&quot;}<br />
    	   <br />
        ]<br />
    }<br />
    




    voici la méthode :
    <br />
    - (void)viewDidLoad {<br />
    [super viewDidLoad];<br />
    //récupération du chemin vers le fichier contenant le JSON<br />
    	 NSString *filePath = [[NSBundle mainBundle] pathForResource:@&quot;info&quot; ofType:@&quot;txt&quot;];<br />
    <br />
    //création d&#39;un string avec le contenu du JSON<br />
    NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];<br />
    <br />
    //Parsage du JSON à  l&#39;aide du framework importé<br />
    NSDictionary *json = [myJSON JSONValue];<br />
    <br />
    <br />
    //récupération du tableau des information<br />
    NSArray *listinfo =  [json objectForKey:@&quot;info&quot;];<br />
    <br />
    info *infor = [[info alloc] init];<br />
    <br />
    for (NSDictionary *dic in listinfo) {<br />
     <br />
    //création d&#39;un objet info<br />
     <br />
      infor.resource = [dic objectForKey:@&quot;resource&quot;];<br />
      infor.business = [dic objectForKey:@&quot;business&quot;];<br />
      infor.service  = [dic objectForKey:@&quot;service&quot;];<br />
      infor.resp = [dic objectForKey:@&quot;responsable&quot;];<br />
    	 }<br />
    lblrs.text = [NSString stringWithFormat:@&quot;%@&quot;,infor.resource];<br />
    NSLog(@&quot;%@&quot;,lblrs.text);<br />
    <br />
    lblbu.text  =  [NSString stringWithFormat:@&quot;%@ &quot;,infor.business];<br />
    NSLog(@&quot;%@&quot;,lblbu.text);<br />
    lblser.text = [NSString stringWithFormat:@&quot;%@ &quot;,infor.service];<br />
    NSLog(@&quot;%@&quot;,lblser.text);<br />
    lblresp.text = [NSString stringWithFormat:@&quot;%@ &quot;,infor.resp];<br />
    NSLog(@&quot;%@&quot;,lblresp.text);<br />
    <br />
    	 [info  release];<br />
    <br />
    <br />
    }<br />
     <br />
    
  • psychoh13psychoh13 Mothership Developer Membre
    août 2012 modifié #13
    Je vois le problème, ton JSON est bancal (définitivement), mais ta façon de le lire n'aide pas.



    Ton JSON déclare un tableau contenant des dictionnaires contenant chacun une seule paire clé-valeur, ça n'a aucun sens, la bonne façon de faire ce serait d'avoir un dictionnaire avec 5 clés-valeurs:


    {<br />
       &quot;info&quot; :{<br />
    	  &quot;resource&quot;: &quot;resource&quot;,<br />
    	  &quot;business&quot;:&quot;  UNIT -B&quot;,<br />
    	  &quot;service&quot;: &quot;service&quot;,<br />
    	  &quot;responsable&quot;: &quot;resp1&quot;,<br />
    	  &quot;nbrHeure&quot;: &quot;30&quot;<br />
       }<br />
    }
    




    Avec ce JSON, tu supprimes simplement le "for" en gardant le contenu, toutes tes variables recevraient une valeur.



    Alors que dans la configuration actuelle, lorsque tu énumères les NSDictionary, chaque propriété de infor reçoit une valeur, le problème c'est qu'à  chaque passage seule une clé se trouve dans le dictionnaire, et tous les autres objectForKey: retourneront nil durant l'itération.

    Ce qu'il faudrait faire serait de vérifier que la valeur que tu récupères n'est pas nil avant de la rentrer dans la propriété.





    Mais comme je l'ai dit, ton JSON en lui-même est bancal, il ne faut pas que ces clés-valeurs soient seules dans un dictionnaire ça n'a aucun sens. Si tu peux avoir plusieurs entrées tu aurais alors un NSArray de NSDictionaries, chaque dictionnaires contiendraient alors les 5 même clés-valeurs.
  • J'ai parfaitement compris...Merci beaucoup pour ton explication...
  • abc88abc88 Membre
    août 2012 modifié #15
    J'aimerai savoir un truc comment je peux ajouter,modifier et supprimer ces données là  ?

    J'ai commencé par importer le JsonKit et chercher des tuto image/smile.png' class='bbc_emoticon' alt=':)' />
  • psychoh13psychoh13 Mothership Developer Membre
    Je suis pas sûr de comprendre ce que tu veux.



    Tu veux lire et écrire tes données localement dans l'application de cette manière-là  ?



    Je te conseille de sauvegarder tes données d'une autre manière, en utilisant NSKeyedArchiver/NSKeyedUnarchiver ce sera beaucoup plus efficace.
Connectez-vous ou Inscrivez-vous pour répondre.