PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WEBDEV 2024 → Résultat JSON
Résultat JSON
Started by MichelH, Feb., 19 2024 5:34 PM - 7 replies
Registered member
94 messages
Posted on February, 19 2024 - 5:34 PM
Bonjour,

Je développe une plateforme web qui va interroger un webservice et celui-ci renvoie un résultat sous format JSON.
J'ai donc déclaré une variable JSON m_jResult pour stocker le résultat.
Le webservice peut renvoyer de 1 à x résultats.
Je dois donc réaliser une procédure pour lire et exploiter ces x résultats. Cette procédure s'inscrit donc dans une boucle.

Le résultat JSON contient une structure arborescente avec des balises imbriquées :
{
"pricing":
{
"spiti":
{
"periodicity":12,
"executionTime":0.766,
"name":"spiti",
"error":0,
"company":
{
"name":"harmonie_mutuelle",
"calculationType":"Capital restant d\u00fb"
},
"executionDate":
{
"date":"2024-02-19 15:49:41.000440",
"timezone":"Europe/Paris",
"timezone_type":3
},
"medical":
{

},
"result":
{
"1":
{
"1":
{
"totalCost":23994.1,
"totalCostTax":24113.1,
"firstTwelveMonthsCost":2362.94,
"firstTwelveMonthsCostWithFees":0,
"eightYearCost":20465.3,
"eightYearCostWithFees":20544.3,
"brokerFirstTwelveMonthsBonus":2167.83,
"rateCommission":"10",
"averageAnnualpremium":1607.52,
"averageRate":0.007655,
"taea":0.0124,
"firstYearCost":2166.94,
"schedule":
[
.......


Je n'ai aucun mal à lire dans cette arborescence et extraire les datas donc j'ai besoin.
Par exemple, si je veux extraire "totalCost"' dans une variable monétaire mCoutTotal, ça donne ceci :
mCoutTotal = m_jResult.pricing.spiti.result["1"]["1"].totalCost


Mais mon problème est que, d'un résultat à un autre, le nom de la balise nommée dans l'exemple "spiti" (nom de produit) change.
J'ai donc remplacé dans le code wlangage :
mCoutTotal = m_jResult.pricing.sNomProduit.result["1"]["1"].totalCost

par une variable qui a chaque boucle va extraire le nom du produit (avec ExtraitChaîneEntre).

Mais cela ne fonctionne pas car Webdev doit lire le nom de la variable et non sa valeur.
J'ai essayé beaucoup de choses (des [ avec ou sans %, ...) mais rien ne fonctionne et je n'arrive pas à trouver la bonne syntaxe.
J'ai essayé aussi de passer de JSON à Variant mais sans plus de succès.
Quelqu'un aurait-il la bonne syntaxe pour faire ce que je veux ?

Merciiii

--
Merci et belle journée !

Michel
Registered member
3,347 messages
Popularité : +93 (137 votes)
Posted on February, 19 2024 - 6:38 PM
Salut
Regarde peut être du côté de la fonction jlit
Sur cette page ( en bas)
https://www.developpez.net/forums/d2062981/environnements-developpement/windev/wd17-parcourir-fichier-json/
Registered member
94 messages
Posted on February, 23 2024 - 5:28 PM
Bonjour,

Et merci pour ta réponse fort intéressante qui m'a appris des choses !
Mais ce n'est pas ce que je veux faire.
Je me réexplique...

Je reçois d'un webervice une réponse en JSON que je n'ai aucun mal à décoder.
J'ai besoin d'aller y cherche un coût total (totalCostTax) qui est dans une arborescence.
Le problème est que d'une réponse à une autre, le second niveau d'arborescence n'est pas figé et change d'une réponse à une autre.
Ça donne ça :
m_jResult.pricing.NomProduitVariable.result["1"]["1"].totalCostTax

NomProduitVariable est une chaine ANSI dans laquelle j'extrais le nom du produit, dans l'exemple "spiti".
Le coût total est stocké dans VarCoutTotal de type Monétaire
Si je veux aller chercher le coût total, je fais :
VarCoutTotal = m_jResult.pricing.NomProduitVariable.result["1"]["1"].totalCostTax

Mais NomProduitVariable qui stocke la valeur "spiti" n'est pas lu comme tel mais comme "NomProduitVariable" et ça ne fonctionne donc pas.
Et je bloque là-dessus, après avoir essayé moultes choses...

--
Merci et belle journée !

Michel
Registered member
3,347 messages
Popularité : +93 (137 votes)
Posted on February, 24 2024 - 2:29 AM
Salut,
Ok pour le nom de produit qui change mais tu écris
" le second niveau d'arborescence n'est pas figé et change d'une réponse à une autre."
Mais tu ne donnes pas d'exemples de changement.
En plus ton extrait est invalide
Je te conseille de copier coller ton json en entier
Sur cette page https://formation.pcscloud.net/wjson_web/fr/
En plaçant le curseur de la souris sur la colonne de droite (la colonne de résultats,) 2 boutons apparaissent :
-le bouton copier (à droite) qui te permet de copier la structure
-le bouton importer les classes.
L'importation des classes permet de télécharger un .zip qui contient la déclaration des classes en .txt.
Tu y verras sûrement plus clair

En copiant collant plusieurs résultats, tu pourras voir les possible changements dont tu parles
Ainsi créer une structure ou classe contenant toutes les possibilités
Registered member
94 messages
Posted on February, 24 2024 - 6:22 PM
Bonjour POPOY,

Peut-être n'ai-je pas été assez clair mais je ne veux pas établir une requête JSON.
Mais merci, au passage, pour ta ressource https://formation.pcscloud.net/wjson_web/fr/, je ne la connaissais pas.
Mais la requête de réponse initiale n'était pas complète d'où les ... à la fin.

Je reçois d'un webservice x réponses JSON, et je veux lire et extraire les données qui m'intéressent pour ces x réponses.
Elles ont toutes le même format sauf que le nom du produit change à chaque réponse.
Dans mon post initial, il s'agit de la balise produit "spiti" (spiti = nom d'un produit) et comme chaque produit a son propre nom, cette balise change d'une réponse à une autre.
Aussi, quand je veux aller lire les rubriques qui sont sous cette balise, ça me pose problème, car la balise n'a jamais le même nom.
Si je veux extraire le coût total, après test :
VarCoutTotal = m_jResult.pricing.spiti.result["1"]["1"].totalCostTax
fonctionne très bien, sauf que je ne connais pas l'ordre des produits avant de lire la réponse.
Donc je veux remplacer spiti par une variable, dans laquelle j'enregistre le nom du produit, du genre :
VarCoutTotal = m_jResult.pricing.NomProduitVariable.result["1"]["1"].totalCostTax
où, à chaque lecture de réponse, j'arrive à extraire le nom du produit (avec des ExtraitChaineEntre) que je stocke dans NomProduitVariable (chaine ANSI).
Sauf que je comprends bien que le nom de la variable NomProduitVariable n'est pas remplacée par sa valeur (spiti par exemple) dans webdev, mais je ne sais pas comment faire pour que ce soit la valeur qui soit lue dans la ligne :
VarCoutTotal = m_jResult.pricing.NomProduitVariable.result["1"]["1"].totalCostTax

Est-ce plus clair ?
Merci et bon week-end.

--
Merci et belle journée !

Michel
Registered member
3,347 messages
Popularité : +93 (137 votes)
Posted on February, 24 2024 - 7:12 PM
Re salut,
C'est pas en répétant à chaque fois, la même chose que tu vas être constructif.
J'ai l'habitude d'essayer de lire complètement une question (en tout cas j'essaie de ne pas lire en diagonale)
En plus, on peut relire ta question initiale quand on pense avoir mal compris.
Là au bout de 3 fois, c'est un peu trop.

En plus, je t'ai fourni le lien qui te permettra de distinguer plus facilement si tu as affaire a un tableau, un tableau d'objets json etc
Ce qui n'est pas toujours évident quand on utilise une variable json
(Constantes wlVariantObjet, wlVariantTableau ) Qui se traite de manière différente
Surtout si tu veux parser ton json

Maintenant, pour essayer de t'aider, la seule chose qui me vient à l'esprit c'est les indirections pour construire ton chemin
https://doc.pcsoft.fr/fr-fr/?1512005
Registered member
397 messages
Popularité : +13 (13 votes)
Posted on February, 26 2024 - 9:29 AM
Bonjour,

Il est dommage de ne pas avoir investigué un peu plus, car finalement vous avez déjà la réponse dans votre question. Ce que vous faites pour aller chercher le totalCostTax, en allant utilisant des chaines "1" pour aller chercher la bonne clé, vous pouvez aussi le faire pour le nom du produit. Car avant d'être des structures, les objets JSON sont des tableaux associatifs.

Ainsi si l'on peut faire :
// Accès en tableau associatif avec la variable en dur
Trace(jData.pricing["spiti"].periodicity) // => 12


L'on peut donc faire cela :
// Accès en variable
sProduit est une chaîne = "spiti"
Trace(jData.pricing[sProduit].periodicity) // => 12


Et si l'on ne connait pas le nom du produit en amont, on peut boucler comme avec un classique tableau associatif :
// Accès en POUR TOUT
POUR TOUT pricing, produit de jData.pricing
Trace(produit) // => "spiti"
Trace(pricing.periodicity) // => 12
FIN
Registered member
94 messages
Posted on February, 26 2024 - 9:50 AM
Bonjour Messieurs,

Merci pour vos réponses.

Tu m'as donné la réponse bchanudet et je l'avais sous les yeux.
C'est ce que j'ai fait en premier mais j'ai commis une petite erreur, à savoir que je mettais un point entre pricing et [sProduit], ce qui déclenchait une erreur de compilation. Et j'avais tellement la tête dans mon sujet que je n'ai pas vu l'évident !

Popoy, merci pour ta patience, j'ai essayé de reformuler ma demande car j'ai compris à plusieurs reprises que tu me proposais de travailler sur la requête à envoyer au WS, ce qui n'était pas du tout mon besoin car déjà fait.

Merci à vous deux !

--
Merci et belle journée !

Michel