PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV Mobile 2024 → Analyser du JSon (sous Android)
Analyser du JSon (sous Android)
Started by Matthieu, Sep., 02 2013 11:51 AM - 8 replies
Posted on September, 02 2013 - 11:51 AM
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
Posted on September, 16 2013 - 11:46 AM
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
Posted on February, 26 2015 - 9:39 AM
Merci beaucoup pour ce code Cyril !!!

Les fonctions permettant de gérer le JSON manquent cruellement dans WM20 pour des applications Android.
Registered member
17 messages
Popularité : +1 (1 vote)
Posted on August, 07 2015 - 1:37 PM
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
Posted on August, 07 2015 - 5:18 PM
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++
Registered member
45 messages
Popularité : +2 (2 votes)
Posted on February, 02 2017 - 11:48 AM
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,"{ ","{")
Posted on May, 10 2017 - 11:04 AM
Bonjour,

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


Cordialement,
Posted on May, 11 2017 - 5:00 PM
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
Registered member
5 messages
Posted on May, 22 2017 - 4:02 PM
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.