PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Analyser du JSon (sous Android)
Analyser du JSon (sous Android)
Débuté par Matthieu, 02 sep. 2013 11:51 - 8 réponses
Posté le 02 septembre 2013 - 11:51
Bonjour,

J'ai besoin d'analyser du Json suite à l'appel à un WebService
J'ai voulu récupérer un composant Windev WD JSON mais il y a des instructions non supportées par Android
Vais-je devoir développer l'analyse moi-même ?
Quelqu'un a une autre idée ?

Matthieu
Posté le 16 septembre 2013 - 11:46
Bonjour. Vous pouvez utiliser ce code :
Bon dev ;)

// Exemple d'utilisation
Json_Lit("resultat[10]/param[2]")
Json_Lit("resultat/param")
Json_Lit("resultat[2]")
Json_Lit("resultat")


Procedure Json_Lit(LOCAL sSourceJson est une chaîne,sCheminALire est une chaîne, sReponseSiPasTrouve est une chaîne = "", sCheminCourant est une chaîne="")
nPosVirgule,nPosCrochet,nPosAccolade,nPosOuvreAccolade,n,m,nElement,nCaract sont des entiers
sElement,sCode,sValeur,sSousElement sont des chaînes

nPosOuvreAccolade=Position(sSourceJson,"{"+Caract(34))
TANTQUE nPosOuvreAccolade>0
sSourceJson=Milieu(sSourceJson,2)
nPosVirgule=Position(sSourceJson,","+Caract(34));nPosCrochet=Position(sSourceJson,":[");nPosAccolade=Position(sSourceJson,":{")
SI nPosVirgule=0 ALORS nPosVirgule=Position(sSourceJson,"}")
TANTQUE nPosVirgule>0 OU nPosCrochet>0
SI nPosVirgule>0 ET ((nPosCrochet=0 OU (nPosCrochet>0 ET nPosVirgule < nPosCrochet)) ET (nPosAccolade=0 OU (nPosAccolade>0 ET nPosVirgule < nPosAccolade))) ALORS
sElement=Gauche(sSourceJson,nPosVirgule-1)
sCode=Remplace(ExtraitChaîne(sElement,1,":"),Caract(34),"")
sValeur=Milieu(sElement,Taille(sCode)+4) //car peut contenir des : comme une adresse web, +3 car 2 guillemets+:
SI Gauche(sValeur,1)=Caract(34) ALORS sValeur=Milieu(sValeur,2)
SI Droite(sValeur,1)=Caract(34) ALORS sValeur=Gauche(sValeur,Taille(sValeur)-1)
SI sCheminALire~=sCheminCourant+["/"]+sCode ALORS RENVOYER sValeur SINON sSourceJson=Milieu(sSourceJson,nPosVirgule+1)
SINON SI nPosAccolade>0 _ET_ (nPosCrochet=0 OU (nPosCrochet>0 ET nPosAccolade < nPosCrochet)) ALORS
sCode=Remplace(Gauche(sSourceJson,nPosAccolade-1),Caract(34),"")
sSourceJson=Milieu(sSourceJson,nPosAccolade+1)
//on trouve l'accolade de fin
n=Position(sSourceJson,"}");m=Position(sSourceJson,"{");nCaract=(m>0 ET m < n) //d'autres sous-élément si { avant un }
TANTQUE nCaract>0
n=Position(sSourceJson,"}",m+1);m=Position(sSourceJson,"{",m+1)
SI (m>0 ET m < n) ALORS
nCaract++
SINON
nCaract--;m=n
FIN
FIN
SI Position(sCheminALire,sCheminCourant+["/"]+sCode+"/")>0 ALORS
RENVOYER Json_Lit(Gauche(sSourceJson,n),sCheminALire,sReponseSiPasTrouve,sCheminCourant+["/"]+sCode)
SINON
sSourceJson=Milieu(sSourceJson,n+2)
FIN
SINON SI nPosCrochet>0 ALORS
sCode=Remplace(Gauche(sSourceJson,nPosCrochet-1),Caract(34),"")
sSourceJson=Milieu(sSourceJson,nPosCrochet+1)
//on trouve le crochet de fin
n=Position(sSourceJson,"]");m=Position(sSourceJson,"[");nCaract=(m>0 ET m < n) //d'autres sous-élément si { avant un }
TANTQUE nCaract>0
n=Position(sSourceJson,"]",m+1);m=Position(sSourceJson,"[",m+1)
SI (m>0 ET m < n) ALORS
nCaract++
SINON
nCaract--;m=n
FIN
FIN
SI Position(sCheminALire,sCheminCourant+["/"]+sCode+"[")>0 ALORS
SI n>0 ET (n <= m OU m=0) ALORS
sSousElement=Milieu(sSourceJson,2,n-2);nElement=0
SINON SI n=0 ALORS
n=Position(sSourceJson,"}");m=Position(sSourceJson,"{");nCaract=(m>0 ET m < n) //d'autres sous-élément si { avant un }
TANTQUE nCaract>0
n=Position(sSourceJson,"}",m+1);m=Position(sSourceJson,"{",m+1)
SI (m>0 ET m < n) ALORS
nCaract++
SINON
nCaract--;m=n
FIN
FIN
sSousElement=Gauche(sSourceJson,n)
SINON
//problème, on a pas trouvé le crochet de fin
RENVOYER sReponseSiPasTrouve
FIN

BOUCLE
m=Position(sSousElement,"{")
SI m>0 ALORS
nElement++;m=1
n=Position(sSousElement,"}",m+1);m=Position(sSousElement,"{",m+1)
SI m>0 _ET_ m < n ALORS
nCaract=1
TANTQUE nCaract <> -1
n=Position(sSousElement,"}",m+1);m=Position(sSousElement,"{",m+1)
SI (m>0 ET m < n) ALORS
nCaract++
SINON
nCaract--;m=n
FIN
FIN
FIN
SI n>0 ALORS
SI Position(sCheminALire,sCheminCourant+["/"]+sCode+"["+nElement+"]")>0 ALORS
RENVOYER Json_Lit(Gauche(sSousElement,n),sCheminALire,sReponseSiPasTrouve,sCheminCourant+["/"]+sCode+"["+nElement+"]")
FIN
sSousElement=Milieu(sSousElement,n+2) //+2 correspond au },
SINON
SORTIR
FIN
SINON
POUR TOUTE CHAINE sValeur DE sSousElement SEPAREE PAR Caract(34)+","+Caract(34)
nElement++
SI Position(sCheminALire,sCheminCourant+["/"]+sCode+"["+nElement+"]")>0 ALORS RENVOYER Remplace(sValeur,Caract(34),"")
FIN
RENVOYER sReponseSiPasTrouve
FIN
FIN

SINON
sSourceJson=Milieu(sSourceJson,n+2)
FIN
FIN
nPosVirgule=Position(sSourceJson,","+Caract(34));nPosCrochet=Position(sSourceJson,":[");nPosAccolade=Position(sSourceJson,":{")
SI nPosVirgule=0 ALORS nPosVirgule=Position(sSourceJson,"}") //pour la dernière accolade
FIN
nPosOuvreAccolade=Position(sSourceJson,"{"+Caract(34),nPosOuvreAccolade)
FIN
RENVOYER sReponseSiPasTrouve
Posté le 26 février 2015 - 09:39
Merci beaucoup pour ce code Cyril !!!

Les fonctions permettant de gérer le JSON manquent cruellement dans WM20 pour des applications Android.
Membre enregistré
17 messages
Popularité : +1 (1 vote)
Posté le 07 août 2015 - 13:37
Bonjour Cyril,

Merci pour ton aide mais, pour être plus explicite, peux-tu nous donner un exemple de fichier JSON ?

Json_Lit("resultat[10]/param[2]") ne me dit rien du tout !

Merci pour ton aide

Pascalou
Posté le 07 août 2015 - 17:18
Bonjour,
Je tiens à précisé que ce n'est pas moi qui ai développé ce code, je me rend compte que je ne l'avait pas précisé.
Donc merci à son développeur.

Bon : il faut savoir qu'il ne faut pas d'espace entre les balises de la chaine json.

Je n'ai jamais pris le temps d'améliorer cela car je n'en ai pas eu besoin, mais si quelqu'un est motivé :)

sRes est une chaîne

sRes = [
{"success":true,"result":[{"type":user,"login":"Cyril","password":"Mon password"},{"type":admin,"login":"Philo","password":"blabliblou"}]}
]

Json_Lit(sRes,"success","KO")// => True
Json_Lit(sRes,"result","KO")// => KO
Json_Lit(sRes,"result/type","KO")// => KO
Json_Lit(sRes,"result[1]/type","KO")// => user
Json_Lit(sRes,"result[2]/type","KO")// => admin
Json_Lit(sRes,"result[2]/password","KO")// => blabliblou

// ATTENTION il n'y a pas de crochet dans celui-là
sRes = [
{"success":true,"result":{"type":user,"login":"Cyril","password":"Mon password"}}
]

Json_Lit(sRes,"success","KO")// => true
Json_Lit(sRes,"result","KO")// => KO
Json_Lit(sRes,"result/login","KO")// => Cyril
Json_Lit(sRes,"result/password","KO")// => Mon password
Json_Lit(sRes,"result[1]/login","KO")// => KO
Json_Lit(sRes,"result[1]/type","KO")// => KO


Voila a++
Membre enregistré
45 messages
Popularité : +2 (2 votes)
Posté le 02 février 2017 - 11:48
Merci pour la procédure, ça m'a été très utile, je me permets juste d'ajouter quelques détails pour les gens qui tomberaient sur ce sujet.
J'utilise l'API Dropbox, les JSon renvoyés ont un espace après chaque virgule, accolade ou ":".

Il faut donc rajouter ces lignes au tout début de la procédure pour que tout fonctionne :
sSourceJson = Remplace(sSourceJson,": ",":")
sSourceJson = Remplace(sSourceJson,", ",",")
sSourceJson = Remplace(sSourceJson,"{ ","{")
Posté le 10 mai 2017 - 11:04
Bonjour,

Est ce que la version WINDEV MOBILE 22 pallie ce manque ?


Cordialement,
Posté le 11 mai 2017 - 17:00
Bonjour,
La Version 22 pallie "partiellement" à ce manque car OUI on peut traiter le JSON comme dans WinDev...
(cette fonctionnalité a été l'ELEMENT DECLENCHEUR de l'usage direct de la V22 en prod devant lire des sources en ODATA/JSON)

Mais Mais .. on ne peut reproduire la méthodologie de WD classique
(qui permet de mettre le résultat d'une requête JSON dans un variant et de parcourir avec POUR TOUT ...)
Dans ce cas, il n'y a pas de "vrai plantage" mais les champs ou leurs contenus sont mal interprétés :-(, bref sur des gros JSON c'est inexploitable en tant que tel.

Pour que cela fonctionne, il faut créer un ensemble d'objets et de structures représentant la réponse JSON et de desérialiser le résultat de la requête dans cette structure.
c'est un peu plus lourd car en cas d'ajout d'une rubrique dans le résultat, il faut modifier les structures MAIS cela marche très très bien.
(je remercie d'ailleurs la personne qui a trouvé cette solution :-) )

La fonction évoquée en début de message a quelques lacunes mais peut dépanner.

Bon courage et bons dévs.
Christian
Membre enregistré
5 messages
Posté le 22 mai 2017 - 16:02
Bonjour Christian,

Merci pour votre réponse.

Nous sommes passé également à la version 22 pour bénéficier de cette avantage, ca fonctionne très bien (y compris sur des formats JSON incluant des tableaux).

Toutefois seul bémol à cela, c'est que malgrès que les champs ne sont pas affectés, la fonction serialise() convertit tous les membres de la structure dans le format JSON. Ce qui peut alourdir considérablement les volumes échangés. Pour le moment pas de solution évidente, si ce n'est de travailler "à la main" pour créer la structure JSON et ainsi n'inclure que les champs renseignés.

Cordialement,

Olivier.