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 :

Extraction d'informations Json


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Extraction d'informations Json
    Bonjour !
    Je vais vous exposer mon soucis.
    Tout d'abord, j'utilise le javascript via la fonction script de Google Spreadsheet afin de récupérer des informations via une API (qui est au format Json). Je précise qu'il s'agit de la première fois que je fais du javascript et que ce n'est que la première étape du travail. Google bridant trop les possibilités de requêtes / invocation de script, je souhaite, plus tard, quand le tout sera opérationnel, switch sur mon petit serveur pour faire ma propre page web et ainsi, ne plus être bridé sur le nombre de requêtes.
    J'ai environ une centaine de lignes de code qui fonctionnent très bien via cette dite API... sauf une ! Le problème se pose via ma fonction qui me permet de récupérer le champ "name" de l'API via une ID.

    Voici la fonction qui marche et ses annotations de tout ce que j'ai pu comprendre au fur et à mesure de mes recherches:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function getItemName(itemID) {
    //Ici l'url qui me ramène au json selon l'ID rentré dans le tableau 
      var myUrl = "http://www.gw2spidy.com/api/v0.9/json/item/" + escape(itemID);
    //Extraction des informations de l'url en HTTPresponse
      var jsonData = UrlFetchApp.fetch(myUrl);
    //Conversion des informations en une chaîne de caractères
      var jsonString = jsonData.getContentText();
    //Pour faciliter sa manipulation, appelle sur le paramètre de l'objet - json.parse permet de traduire une chaîne en objet
      var jsonObject = JSON.parse(jsonString).result;
    //Là on précise qu'on veut la valeur "name" de l'objet
      var name = (jsonObject.name);
      Utilities.sleep(2000);
    return name;
    }
    Ici, il n'y a pas de problème sur la fonction, elle récupère bel et bien le "nom" de l'objet via son ID. Le problème ? Ce n'est pas cette API (car non-officielle et bridé sur le nombre de requêtes possible) que je souhaite utiliser. Donc j'ai juste changer le lien qui ramène à la bonne API:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function getItemName(itemID) {
      var myUrl = "https://api.guildwars2.com/v2/items/" + escape(itemID);
      var jsonData = UrlFetchApp.fetch(myUrl);
      var jsonString = jsonData.getContentText();
      var jsonObject = JSON.parse(jsonString).result;
      var name = (jsonObject.name);
      Utilities.sleep(2000);
    return name;
    }
    Problème ? le script Google ne récupère rien, si j'utilise cette fonction, je me retrouve avec écris dans ma petite case du tableau: "ERROR: impossible de lire la propriété "name" depuis undefined ligne 17 (ligne qui rapporte à ma variable " var name = (jsonObject.name);").

    Du coup j'ai tenté la fonction en retirant le jsonObject afin de voir si, au moins, le script pouvait me récupérer et lire le json:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function getItemName(itemID) {
      var myUrl = "https://api.guildwars2.com/v2/items/" + escape(itemID);
      var jsonData = UrlFetchApp.fetch(myUrl);
      var jsonString = jsonData.getContentText();
      return jsonString;  
    }
    Ici, je me retrouve avec la totalité du tableau json en une seule case vu le retour directement sur le jsonString donc j'en ai déduit que le le corps de la fonction et les variables précédentes fonctionnaient bien.

    J'ai alors essayé de définir le "undefined" avec "typeof" (ce que j'ai trouvé sur le net: apprendre à lire l'erreur tel qu'elle est donnée, ici le script lit vraiment undefined sur la propriété "name")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function getItemName(itemID) {
      var myUrl = "http://api.guildwars2.com/v2/items/" + escape(itemID);
      var jsonData = UrlFetchApp.fetch(myUrl);
      var jsonString = jsonData.getContentText();
      var JsonObject = JSON.parse(jsonString).result;
      var name = JsonObject
       if ((typeof name === "undefined")) {
        JsonObject = JSON.parse(jsonString).result;
      }
        Utilities.sleep(2000);
      return name;
    }}
    Là, je me retrouve avec une case toute vide...

    J'ai essayé de définir le jsonObject en utilisant la propriété "lenght" mais là, si j'ai bien compris, on donne, via cette propriété, le nombre de caractère de la chaîne. Problème, ici, c'est aléatoire donc je ne peux pas la définir puisque qu'un ID va rapporter à un certain nombre de caractère, puis avec une autre ID, je vais me retrouver avec un autre nombre de caractère puisque ça ne sera pas le même objet.

    Comme j'ai pas mal campé les recherches google, tutoriels et j'en passe (ça fait environ 1 mois que je bloque là dessus), j'ai commencé à comprendre pas mal de choses même si j'ai encore un manque de lexique certain... Les 3/4 de mes recherches Google m'ont amené à des gens qui avaient des soucis pour retranscrire du javascript en json... Mais moi, c'est l'inverse que je veux
    Pour preuve, toutes les autres fonctions marchent, et elles utilisent toutes l'API que je veux. Mais je n'arrive toujours pas à comprendre pourquoi ma fonction ne veut pas me récupérer la valeur "name" du json officiel, alors que la même fonction via une autre API (non officiel) fonctionne très bien (soit juste un changement d'URL !).
    J'ai utilise cette même fonction, pour d'autres informations, ça marche nickel. Par exemple, récupérer un prix de vente ou d'achat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function getSellValue(itemID) {
      var myUrl = "https://api.guildwars2.com/v2/commerce/listings/" + escape(itemID);
      var jsonData = UrlFetchApp.fetch(myUrl);
      var jsonString = jsonData.getContentText();
      var jsonObject = JSON.parse(jsonString);
      if (jsonObject.sells.length === 0) {
        return 0;
      }
      var adjustedValue = (jsonObject.sells[0].unit_price );
        Utilities.sleep(2000);
      return adjustedValue;
    }
    J'utilise la bonne API, toujours du json et la fonction extrait l'information que je souhaite via l'ID d'un objet !

    Voici un lien de l'API officiel en état "brut" format json. Et la non officiel sur ce lien. Dans les 2 cas, j'utilise la même ID pour comparer. La seule différence est que sur la non officiel on trouve " "result":{"data_id":20176, " en plus par rapport à l'autre, sinon, le reste, c'est pareil. Est-ce que le problème vient de là ?
    Alors hum, si une âme charitable arrive à me corriger, j'en serai ravie En espèrant qu'il y ait toutes les informations nécessaires

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var jsonObject = JSON.parse(jsonString);
    te retourne un objet javascript
    la nature de cet objet dépend du contenu de la chaine jsonString.

    si cette chaine contient quelque chose comme {"name": "toto", .... }, JSON.parse te retourne un objet dont un membre s'appelle name. si la chaine contient quelque chose de la forme ["titi", "toto", .... ], JSON.parse te retourne un tableau qui contient titi et toto.

    il te suffit de mettre un point d'arrêt dans ton débugueur pour voir la nature de jsonObject.

    il est difficile de te réponde vu qu'on n'a aucune info sur le contenu.

    la syntaxe JSON est très simple
    {...} défini un objet
    [...] défini un tableau
    "..." défini une string
    true défini un boolean
    15.6 défini un Number


    A+JYT

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Rhaaaaa voilà ce que je n'arrivais pas à faire, arrêter le jsonObject au bon endroit !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return jsonObject.name;
    Je me sens toute bête maintenant ! Merci beaucoup à toi, maintenant ça fonctionne !

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Re

    tu mets ton point d'arrêt sur la ligne qui suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var jsonObject = JSON.parse(jsonString);
    A+JYT

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraction d'informations à partir d'un fichier
    Par narmika dans le forum Langage
    Réponses: 7
    Dernier message: 26/09/2007, 13h45
  2. Réponses: 1
    Dernier message: 10/04/2007, 23h53
  3. extraction d'informations conditionnelle
    Par raboliot dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2007, 10h39
  4. [XSLT][PHP] Extraction d'informations d'un XML
    Par H¤N£y dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 10/12/2006, 10h05
  5. Extraction d'informations
    Par sam.fet dans le forum Linux
    Réponses: 2
    Dernier message: 15/06/2006, 17h18

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