IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Parser un JSON


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Parser un JSON
    Bonjour,

    Je rencontre actuellement un soucis avec un fichier JSON que je parse je n'arrive pas à récupérer les informations stocker à l'intérieur

    voici mon code ainsi que mon json
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var xhr = new XMLHttpRequest();
    xhr.open("GET", 'loaditem.json', false);
    xhr.send(null);
    if(xhr.readyState != 4 || (xhr.status != 200 && xhr.status != 0)) // Code == 0 en local
     
        throw new Error("Impossible de charger les objets nommée\" (code HTTP : " + xhr.status + ").");
     
    var mapJsonData = xhr.responseText;
    var obj1 = JSON.parse(mapJsonData);
     
    var drawItem = function(){
        for (i in obj1){
            context.drawImage(Img.item[obj1.item[i].nom],0, 0, 511, 541, 0,0, 511, 541);
            }
     
        }
    json:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
       "item":[
          {
             "id":"1",
             "nom":"itme1",
             "lien":"img/item01.png",
             "x":"200",
             "y":"200",
             "taillel":"511",
             "tailleh":"541"
          }
       ]
    }
    TypeError: obj1.item[i] is undefined

    je n'arrive pas à savoir pourquoi.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 642
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    que retourne un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log ( xhr.responseText )
    ?

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    j'ai résolu le soucis en rajoutant un var i = 0; cependant je possède 2 objets dans le json et la boucle for ne prend en compte que le premier sans afficher le 2ème
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (i in obj1){
    		var i = 0;
    		//console.log(obj1.item[i].nom);
    		context.drawImage(Img.item[obj1.item[i].nom],0, 0, obj1.item[i].taillel, obj1.item[i].tailleh, obj1.item[i].x,obj1.item[i].y, obj1.item[i].taillel, obj1.item[i].tailleh);
    i++
    		}

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Il semble que tu n’aies pas encore complètement compris certaines notions de JS. Ne t’en fais pas, c’est normal, et en venant sur ce forum tu as frappé à la bonne porte pour apprendre

    Premièrement, prends garde que ta variable i ne soit pas globale par erreur. Il faut toujours utiliser var. Le mode strict te permet de repérer rapidement ce genre de problème.

    Deuxièmement, itérer sur un tableau avec for (in) est déconseillé, car cette boucle est faite pour itérer sur les propriétés d’un objet ; c’est seulement « par accident » que les indices d’un tableau sont également considérés comme des propriétés. Si jamais du code tiers sur ton site ajoute des propriétés sur les tableaux (par exemple une méthode bidule), ton i va se retrouver avec la valeur "bidule" à un moment dans ta boucle, et il est évident qu’il n’y a pas d’item.bidule dans ton JSON.

    Dans ta boucle, ajoute un console.log(i); pour voir ce qui se passe.

    Préfère une bonne vieille boucle for (…; …; …) classique, ou alors la méthode forEach. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      obj1.forEach(function (it) {
        context.drawImage(Img.item[it.nom],
          0, 0,
          it.taillel, it.tailleh,
          it.x, it.y,
          it.taillel, it.tailleh);
      });
    Enfin, ta requête Ajax est synchrone, c’est une mauvaise pratique. Documente-toi sur les fonction de rappel (callback) pour apprendre à tirer le meilleur parti d’Ajax. En attendant, voici à quoi doit ressembler ton code avec une requête asynchrone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    var drawItem = function (obj1) {
      obj1.forEach(function (it) {
        context.drawImage(Img.item[it.nom],
          0, 0,
          it.taillel, it.tailleh,
          it.x, it.y,
          it.taillel, it.tailleh);
      });
    };
     
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'loaditem.json');
     
    xhr.onload = function () {
      if (xhr.status !== 200) {
         throw new Error('Erreur Ajax (code = ' + xhr.status + ')');
      }
      var mapJsonData = xhr.responseText;
      var obj1 = JSON.parse(mapJsonData);
      drawItem(obj1);
    };
     
    xhr.onerror = function () {
      throw new Error('Erreur de connexion');
    };
     
    xhr.send(null);
    Dernière remarque : personnellement j’aime bien mettre un try/catch autour de JSON.parse, mais tu fais comme tu veux.

Discussions similaires

  1. Parser un JSON avec des variables avec des "-" et des ":"
    Par Quentin33 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 22/05/2011, 01h04
  2. Parser du json
    Par nox73 dans le forum Langage
    Réponses: 4
    Dernier message: 19/05/2011, 19h52
  3. Parser page JSON en PHP
    Par tonymx15 dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2011, 00h55
  4. [Prototype] Parser du JSON aprés une requête Ajax
    Par Gregory.M dans le forum Bibliothèques & Frameworks
    Réponses: 18
    Dernier message: 16/06/2010, 10h21
  5. parser un json
    Par Henry9 dans le forum jQuery
    Réponses: 4
    Dernier message: 18/05/2009, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo