Parser Json en javascript

Parser Json en javascript - Javascript/Node.js - Programmation

Marsh Posté le 20-03-2015 à 18:54:55    

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:

Reply

Marsh Posté le 20-03-2015 à 18:54:55   

Reply

Marsh Posté le 20-03-2015 à 23:02:26    

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...
Reply

Marsh Posté le 22-03-2015 à 15:03:30    

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
Reply

Marsh Posté le 22-03-2015 à 20:32:52    

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...
Reply

Marsh Posté le 22-03-2015 à 20:47:45    

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
Reply

Marsh Posté le 22-03-2015 à 21:34:37    

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...
Reply

Marsh Posté le 22-03-2015 à 21:35:16    

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


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 22-03-2015 à 21:59:28    

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
Reply

Marsh Posté le 22-03-2015 à 22:31:03    

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...
Reply

Marsh Posté le 22-03-2015 à 23:03:42    

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
Reply

Marsh Posté le 22-03-2015 à 23:03:42   

Reply

Marsh Posté le 22-03-2015 à 23:31:53    

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...
Reply

Marsh Posté le 22-03-2015 à 23:47:43    

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
 
 

Reply

Marsh Posté le 22-03-2015 à 23:53:09    

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^^

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed