Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1544 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Parser Json en javascript

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Parser Json en javascript

n°2253818
ticola
Posté le 20-03-2015 à 18:54:55  profilanswer
 

Bonjour,
 
voici mon fichier:
https://www.kimonolabs.com/api/dh15 [...] rj8LRpbFIz
 
Comme vous pouvez le voir il y a plusieurs fois categorie9, plusieurs foirs catégorie8, plusieurs fois 407..
 
L'idée c'est de nettoyer le fichier json pour garder qu'un seule fois une catégorie de chaque avec comme condition le prix minimal.
Pour sa je peux parser le fichier json et écrire un script direcement à la source sur programme qui me génère le fichier json.
 
En fait comme je ne sais pas vraiment coder j'ai utilisé kimonolabs qui me permet de récupérer des données d'un site web puis de d'écrire dans un fichier json.
[img]http://img15.hostingpics.net/pics/634952json.png[/img]
 
Voila peut on m'aider svp à nettoyer les données. J'ai regardé sur google mais parser json javascript il des trucs mais je suis pas vraiment à l'aise avec.
 
Merci :hello:

mood
Publicité
Posté le 20-03-2015 à 18:54:55  profilanswer
 

n°2253828
SICKofitAL​L
misanthrope
Posté le 20-03-2015 à 23:02:26  profilanswer
 

Salut
 
dans ta fonction transform, le parametre "data" c'est quoi ? le json (texte) ou un object ?
si tu ne le sais pas, tu peux y rajouter un
console.log (data); // avant le return bien sur
 
Si il s'agit d'un object, tu n'as donc pas besoin de le parser, et du coup tu peux boucler dedans.
Genre :

Code :
  1. data.results.collection1.forEach (function (v)
  2. {
  3.   if (v.cat === "ALEATOIRE Cat. 9" )
  4.   { /* ... */ }
  5. });


 
etc... :)


---------------
We deserve everything that's coming...
n°2253888
ticola
Posté le 22-03-2015 à 15:03:30  profilanswer
 

Merci de ton aide voilà où j'en suis.

 
Code :
  1. function(data) {
  2.   var test =0;
  3.   var test2=0;
  4.  
  5.   for(var collection in data.results) {
  6.  
  7.     data.results[collection].forEach(function(f) {
  8.      
  9.       var NouveauPrix = f.Prix.substring(1,10);
  10.       f.Prix = parseFloat(NouveauPrix);
  11.    
  12.       var NouveauQuantité = f.Quantité.substring(0,10);
  13.       f.Quantité = parseFloat(NouveauQuantité);
  14.      
  15.       var NouveauRang = f.Rang.substring(0,10);
  16.       f.Rang = parseFloat(NouveauRang);
  17.  
  18.       test2 = Math.max(f.Prix);
  19.  
  20.         if (f.Cat == "ALEATOIRE Cat. 9" )
  21.           {
  22.           test = Math.min(6, 10);
  23.           }
  24.  
  25.  
  26.     });
  27.   };
  28. data.test = test;
  29. data.test2 = test2
  30.   return data;
  31. }
 
Code :
  1. {
  2.   "name": "PSG",
  3.   "count": 16,
  4.   "frequency": "Every hour",
  5.   "version": 5,
  6.   "newdata": true,
  7.   "lastrunstatus": "success",
  8.   "lastsuccess": "Sun Mar 22 2015 16:14:50 GMT+0000 (UTC)",
  9.   "thisversionstatus": "success",
  10.   "nextrun": "Sun Mar 22 2015 17:14:50 GMT+0000 (UTC)",
  11.   "thisversionrun": "Sun Mar 22 2015 16:14:50 GMT+0000 (UTC)",
  12.   "results": {
  13.     "collection1": [
  14.       {
  15.         "Cat": "ALEATOIRE Cat. 9",
  16.         "Rang": 18,
  17.         "Quantité": 1,
  18.         "Prix": 167
  19.       },
  20.       {
  21.         "Cat": "ALEATOIRE Cat. 8",
  22.         "Rang": 32,
  23.         "Quantité": 1,
  24.         "Prix": 167
  25.       },
  26.       {
  27.         "Cat": "ALEATOIRE Cat. 9",
  28.         "Rang": 12,
  29.         "Quantité": 1,
  30.         "Prix": 167
  31.       },
  32.       {
  33.         "Cat": "ALEATOIRE Cat. 9",
  34.         "Rang": 20,
  35.         "Quantité": 1,
  36.         "Prix": 167
  37.       },
  38.       {
  39.         "Cat": "ALEATOIRE Cat. 9",
  40.         "Rang": 20,
  41.         "Quantité": 1,
  42.         "Prix": 168
  43.       },
  44.       {
  45.         "Cat": "ALEATOIRE Cat. 9",
  46.         "Rang": 20,
  47.         "Quantité": 1,
  48.         "Prix": 168
  49.       },
  50.       {
  51.         "Cat": "ALEATOIRE Cat. 9",
  52.         "Rang": 12,
  53.         "Quantité": 1,
  54.         "Prix": 169
  55.       },
  56.       {
  57.         "Cat": "ALEATOIRE Cat. 9",
  58.         "Rang": null,
  59.         "Quantité": 1,
  60.         "Prix": 170
  61.       },
  62.       {
  63.         "Cat": "ALEATOIRE Cat. 8",
  64.         "Rang": 29,
  65.         "Quantité": 1,
  66.         "Prix": 170
  67.       },
  68.       {
  69.         "Cat": "ALEATOIRE Cat. 8",
  70.         "Rang": 6,
  71.         "Quantité": 1,
  72.         "Prix": 170
  73.       },
  74.       {
  75.         "Cat": "ALEATOIRE Cat. 8",
  76.         "Rang": 15,
  77.         "Quantité": 1,
  78.         "Prix": 170
  79.       },
  80.       {
  81.         "Cat": "ALEATOIRE Cat. 9",
  82.         "Rang": 7,
  83.         "Quantité": 1,
  84.         "Prix": 170
  85.       },
  86.       {
  87.         "Cat": "ALEATOIRE Cat. 9",
  88.         "Rang": 13,
  89.         "Quantité": 1,
  90.         "Prix": 170
  91.       },
  92.       {
  93.         "Cat": "ALEATOIRE Cat. 9",
  94.         "Rang": 20,
  95.         "Quantité": 1,
  96.         "Prix": 170.5
  97.       },
  98.       {
  99.         "Cat": "ALEATOIRE Cat. 9",
  100.         "Rang": 11,
  101.         "Quantité": 1,
  102.         "Prix": 172
  103.       },
  104.       {
  105.         "Cat": "ALEATOIRE Cat. 9",
  106.         "Rang": 4,
  107.         "Quantité": 1,
  108.         "Prix": 173
  109.       }
  110.     ]
  111.   },
  112.   "test": 6,
  113.   "test2": 173
  114. }


J'ai transformer mes chaînes String en Float.

 

Maintenant j'aimerai nettoyer le reste, c'est à dire de virer toutes les catégories similaires en gardant le prix minimal.
Sauf que je fais une erreur en utilisant la méthode math.min() je lis que la dernière valeur de collection et non l'ensemble.

 

Quelle est mon erreur?

 

Je pense qu'il faut que j'adapte ce code:
[img]http://img15.hostingpics.net/pics/139991Supprimerlescat.png[/img]

 

La dernière méthode pour filtrer ne marche pas. Je ne vois pas pourquoi.
Peux tu m'expliquer data.results[collection].forEach(function(f) ou data.results[collection].filter(function(user) c'est quoi la différence?


Message édité par ticola le 22-03-2015 à 18:59:43
n°2253907
SICKofitAL​L
misanthrope
Posté le 22-03-2015 à 20:32:52  profilanswer
 

Math.max recoit au moins 2 paramètres et renvoit le plus grand.
Donc par exemple :
Math.max (10, 20, 2, 15, 19) renvoit 20
 
Dans ton cas ca ne te sert pas je pense, tu devrais garder le prix précedent dans une variable, et vérifier que celui que tu tests est plus grand ou pas (si j'ai bien compris ton cheminement). Si oui, tu le gardes et tu remplaces la variable, si non, tu remplaces le champ.
Un truc comme ca :

Code :
  1. function(data) {
  2.   var test =0;
  3.   var test2=0;
  4.   var precPrix = -1;
  5.   for(var collection in data.results) {
  6.     data.results[collection].forEach(function(f) {
  7.    
  8.       var NouveauPrix = f.Prix.substring(1,10);
  9.       // à toi de modifier le test pour que ca corresponde à ce que tu veux
  10.       if (NouveauxPrix < precPrix)
  11.       {
  12.         f.Prix = precPrix;
  13.       }
  14.       else
  15.       {
  16.           f.Prix = parseFloat(NouveauPrix);
  17.           precPrix = f.Prix;
  18.       }
  19.    // ...


 
Du coup, concernant le filter, c'est vrai que c'est potentiellement plus adapté.
forEach ne fait que boucler dans les elements d'ub tableau en appliquant une fonction à chaque element, mais ne renvoit rien.
Alors que filter boucle dans un tableau et en revoit un autre. Selon la valeur de retour de la fonction qui est appliquée à chacun des elements, true on garde et false on garde pas.

Code :
  1. var a = [ 10, 20, 30, 50, 60 ];
  2. var b = a.filter (function (v) { return v >= 30; });
  3. // renvoit [ 30, 50, 60 ]


 
Dans ton cas, c'est surement plus approprié je pense :)


---------------
We deserve everything that's coming...
n°2253908
ticola
Posté le 22-03-2015 à 20:47:45  profilanswer
 

Oui, la fonction filter est idéale mais elle ne marche pas telle qu'elle écrite dans l'exemple4 de la photo.  
 
 

Code :
  1. function(data) {
  2.   var test =0;
  3.   var test2=0;
  4.   for(var collection in data.results) {
  5.     data.results[collection].forEach(function(f) {
  6.    
  7.       var NouveauPrix = f.Prix.substring(1,10);
  8.       f.Prix = parseFloat(NouveauPrix);
  9.  
  10.       var NouveauQuantité = f.Quantité.substring(0,10);
  11.       f.Quantité = parseFloat(NouveauQuantité);
  12.    
  13.       var NouveauRang = f.Rang.substring(0,10);
  14.       f.Rang = parseFloat(NouveauRang);
  15.       test2 = Math.max(f.Prix);
  16.         if (f.Cat == "ALEATOIRE Cat. 9" )
  17.           {
  18.           test = Math.min(6, 10);
  19.           }
  20.     });
  21.   };
  22. for(var collection in data.results) {
  23.     data.results[collection].filter(function(user) {
  24.       return user.Prix >= 179;
  25.     });
  26.   };
  27. data.test = test;
  28. data.test2 = test2
  29.   return data;
  30. }


 
J'écris ce code mais rien ne se passe. Mais je mets  return user.Prix = 179; tous les prix passent à 179, donc çà marche un peu mais le nouveau tableau ne s'affiche pas. C'est la que je ne comprends pas.
 
Après je suis débutant en code et c'est la première fois que je touche à du javascript. Bon c'est proche du java. Mais j'ai toujours des soucis avec les arguments du style:
 

Code :
  1. for(var collection in data.results) {
  2.     data.results[collection].forEach(function(f)

 
 
Encore merci pour ton aide


Message édité par ticola le 22-03-2015 à 20:48:14
n°2253912
SICKofitAL​L
misanthrope
Posté le 22-03-2015 à 21:34:37  profilanswer
 

La seule chose proche du java avec javascript, c'est le nom. Et un peu de syntaxe à la rigueur.
 
Concernant le filtrage, tu fais :
var NouveauPrix = f.Prix.substring(1,10);
f.Prix = parseFloat(NouveauPrix);
 
Déjà, poru faire une substring sur un Number, il faut le caster en String, et ensuite tu le recastes en Number ?
Et le substring (1,10), est-il normal ?
170 devient 70 du coup
 
Dans JSON, les champs Rang, Quantite et Prix sont déjà des Number, donc à moins de vouloir traiter qqch en particulier, pas besoin de substring et de parseFloat ;)
 
Essayes déjà ca :)


---------------
We deserve everything that's coming...
n°2253913
SICKofitAL​L
misanthrope
Posté le 22-03-2015 à 21:35:16  profilanswer
 

Ensuite, le filter semble donner le résultat que tu attends :jap:


---------------
We deserve everything that's coming...
n°2253915
ticola
Posté le 22-03-2015 à 21:59:28  profilanswer
 

SICKofitALL a écrit :

La seule chose proche du java avec javascript, c'est le nom. Et un peu de syntaxe à la rigueur.

 

Concernant le filtrage, tu fais :
var NouveauPrix = f.Prix.substring(1,10);
f.Prix = parseFloat(NouveauPrix);

 

Déjà, poru faire une substring sur un Number, il faut le caster en String, et ensuite tu le recastes en Number ?
Et le substring (1,10), est-il normal ?
170 devient 70 du coup

 

Dans JSON, les champs Rang, Quantite et Prix sont déjà des Number, donc à moins de vouloir traiter qqch en particulier, pas besoin de substring et de parseFloat ;)

 

Essayes déjà ca :)

 

https://www.kimonolabs.com/apis/dh15upmm
Non, les Prix ne sont pas des Number. Et les Quantités et Rang non plus si tu regardes le code avant modification il y a les " ", comme "€170.00"
C'est pour ça que je caste, pour manipuler des Number.
Ce qui m'a guider c'est l'example 4 de la photo que j'ai posté plus haut. Il y a "Points": 329 C'est différent de "329"

 
SICKofitALL a écrit :

Ensuite, le filter semble donner le résultat que tu attends :jap:

 

Non j'ai tout essayer sans le caste avec le caste je n'y arrive pas.

 

Voici le JSON AVANT:
https://www.kimonolabs.com/api/dh15 [...] rj8LRpbFIz

 
Code :
  1. function(data) {
  2.  
  3.   for(var collection in data.results) {
  4.  
  5.     data.results[collection].forEach(function(f) {
  6.      
  7.       var NouveauPrix = f.Prix.substring(1,10);
  8.       f.Prix = parseFloat(NouveauPrix);
  9.    
  10.       var NouveauQuantité = f.Quantité.substring(0,10);
  11.       f.Quantité = parseFloat(NouveauQuantité);
  12.      
  13.       var NouveauRang = f.Rang.substring(0,10);
  14.       f.Rang = parseFloat(NouveauRang);
  15.  
  16.  
  17.  
  18.      
  19.  
  20.  
  21.     });
  22.   };
  23.   return data;
 

Voici le JSON APRES:
https://www.kimonolabs.com/api/dh15 [...] immodify=1

 


Voici le code avec filter mais je n'y arrive pas

 
Code :
  1. function transform(data) {
  2.   for(var collection in data.results) {
  3.  
  4.     data.results[collection].forEach(function(f) {
  5.      
  6.       var NouveauPrix = f.Prix.substring(1,10);
  7.       f.Prix = parseFloat(NouveauPrix);
  8.    
  9.       var NouveauQuantité = f.Quantité.substring(0,10);
  10.       f.Quantité = parseFloat(NouveauQuantité);
  11.      
  12.       var NouveauRang = f.Rang.substring(0,10);
  13.       f.Rang = parseFloat(NouveauRang);
  14.  
  15.     });
  16.   };
  17. for(var collection in data.results) {
  18.     data.results[collection].filter(function(user) {
  19.       return user.Prix >= 179;
  20.     });
  21.   };
  22.  
  23.   return data;
  24. }
 

Edit: Il n'y a aucun changement.


Message édité par ticola le 22-03-2015 à 22:01:25
n°2253916
SICKofitAL​L
misanthrope
Posté le 22-03-2015 à 22:31:03  profilanswer
 

Ah oui en effet, j'avais zappé le début du thread.
Et ca, ca donne quoi ?

Code :
  1. function(data)
  2. {
  3.       for(var collection in data.results)
  4.       {
  5.         var c = data.results[collection].filter (function(f)
  6.         {
  7.           f.Prix = parseFloat (String (f.Prix).replace (/[^\d]/, '')); // je passe par un regexp plutot que par un substring, plus versatile je pense
  8.           if (f.Prix < 179)
  9.           {
  10.             return false;
  11.           }
  12.           f.Quantité = parseFloat (String (f.Quantité).replace (/[^\d]/, ''));
  13.           f.Rang = parseFloat (String (f.Rang).replace (/[^\d]/, ''));
  14.           return true;
  15.         });
  16.         data.results[collection] = c;
  17.       };
  18.       return data;
  19.     };


---------------
We deserve everything that's coming...
n°2253920
ticola
Posté le 22-03-2015 à 23:03:42  profilanswer
 

DSl mais ça donne ça:
{
  "error": "Bad Request",
  "message": "Your function failed to evaluate."
}
 
Je ne sais pas vraiment pourquoi mais j'ai essayé ça:
 

Code :
  1. function(data) {
  2.   var test =0;
  3.   var test2=0;
  4.  
  5.   for(var collection in data.results) {
  6.    
  7.  
  8.     data.results[collection].filter(function(f) {
  9.      
  10.      
  11.       var NouveauPrix = f.Prix.substring(1,10);
  12.       f.Prix = parseFloat(NouveauPrix);
  13.    
  14.       var NouveauQuantité = f.Quantité.substring(0,10);
  15.       f.Quantité = parseFloat(NouveauQuantité);
  16.      
  17.       var NouveauRang = f.Rang.substring(0,10);
  18.       f.Rang = parseFloat(NouveauRang);
  19.  
  20.  
  21.  
  22.  
  23.  
  24.     });
  25.   }
  26.  
  27. return data.results[collection].filter(function(user) {
  28.       return user.Prix >= 173;
  29.     });
  30.  
  31. }


 
Resultat:
[
  {
    "Cat": "ALEATOIRE Cat. 9",
    "Rang": 4,
    "Quantité": 1,
    "Prix": 173
  }
]
 
Bon, il y a deux choses la première c'est que je fais sauter le reste c'est à dire le début:

Code :
  1. {
  2.   "name": "PSG",
  3.   "count": 16,
  4.   "frequency": "Every hour",
  5.   "version": 5,
  6.   "newdata": true,
  7.   "lastrunstatus": "success",
  8.   "lastsuccess": "Sun Mar 22 2015 16:14:50 GMT+0000 (UTC)",
  9.   "thisversionstatus": "success",
  10.   "nextrun": "Sun Mar 22 2015 17:14:50 GMT+0000 (UTC)",
  11.   "thisversionrun": "Sun Mar 22 2015 16:14:50 GMT+0000 (UTC)",
  12.   "results": {


 
Puis je n'ai pas le minimum de mon prix pour chaque catégorie.
 
Je galère  trop. :pt1cable:


Message édité par ticola le 22-03-2015 à 23:16:39
mood
Publicité
Posté le 22-03-2015 à 23:03:42  profilanswer
 

n°2253921
SICKofitAL​L
misanthrope
Posté le 22-03-2015 à 23:31:53  profilanswer
 

Failed to evaluate ?
Je ne sais pas comment il integre le code, mais il est possible que les guillements dans le replace foutent la merde
remplace les
replace (/[^\d]/, ''));
 
par des
replace (/[^\d]/, "" ));
 
Concernant ton code, filter renvoit qqch, mais ne modifie pas le array "inline".


---------------
We deserve everything that's coming...
n°2253923
ticola
Posté le 22-03-2015 à 23:47:43  profilanswer
 

Bon merci de prendre du temps pour mon problème.
 
Je t'explique ce que je veux faire.
 
Le fichier Json est crée à partir de données d'un site, c'est l'api kimonolabs qui le la créee. Pourquoi j'utilise ce truc? Tout simplement comme tu peux le voir niveau code je suis débutant. On m'avait donné la procédure à suivre c'était:
 
curl pour choper la page
parser la page
xml pour le stockage.
 
Sauf que j'ai trouvé kimonolabs qui je pense s'avère plus simple.
 
Là ou c'est compliquer c'est que les données que tu vois dans le json son fixe dans le temps. Une fois qu' "On" (j'espère que tu va m'aider  :D ) aura nettoyer le code il nous restera donc ces fichus catégories avec leur prix mini pour un temps fixé.  
 
Mais, j'ai configurer l'API pour que les données se refresh toutes le heures donc le json va être actualisé avec de nouveaux prix. Derrière notre code de nettoyage opère.
 
Alors pour le problème dans le temps ben je sais pas trop comment je vais faire mais j'imagine que on peut stocker chaque json et dater les données.
 
Le but final c'est de tracer un petit graphique des prix de chaque catégorie en fonction du temps en local (Excel ou autre)/ cloud mais le plus SIMPLE des deux.
 
Voilà. Tu penses que c'est jouable?  
Ou je devrais faire autrement?
Merci
 
 

n°2253924
ticola
Posté le 22-03-2015 à 23:53:09  profilanswer
 

SICKofitALL a écrit :

Failed to evaluate ?
Je ne sais pas comment il integre le code, mais il est possible que les guillements dans le replace foutent la merde
remplace les
replace (/[^\d]/, ''));
 
par des
replace (/[^\d]/, "" ));
 
Concernant ton code, filter renvoit qqch, mais ne modifie pas le array "inline".


 
 
pareil, mais les "" et '' c'est vu de la même façon. J'ai tout testé j'y ai passé la journée ça me soule^^


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Parser Json en javascript

 

Sujets relatifs
Aide sur Javascript pour un pdf intéractifCompatibilité IE8-10-11 : HELP !
HTLM/JavaScript : faire clignoter une URLJavascript & Html demande de correction
[html et JavaScript] Récupération d'informations et ré-utilisationJavascript Selector / colonne d'un tableau
[JAVA] Parser un fichier de log sans le lockerMenu et compatibilité Javascript IE
Parser un fichier.txt en PHPRécupération de données passées via Javascript
Plus de sujets relatifs à : Parser Json en javascript


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR