|
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
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) 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)
n=Position(sSourceJson,"}");m=Position(sSourceJson,"{");nCaract=(m>0 ET m < n) TANTQUE nCaract>0 n=Position(sSourceJson,"}",m+1);m=Position(sSourceJson,"{",m+1) SI (m>0 ET m < n) ALORS nCaract++ SINON nCaract 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)
n=Position(sSourceJson,"]");m=Position(sSourceJson,"[");nCaract=(m>0 ET m < n) TANTQUE nCaract>0 n=Position(sSourceJson,"]",m+1);m=Position(sSourceJson,"[",m+1) SI (m>0 ET m < n) ALORS nCaract++ SINON nCaract 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) TANTQUE nCaract>0 n=Position(sSourceJson,"}",m+1);m=Position(sSourceJson,"{",m+1) SI (m>0 ET m < n) ALORS nCaract++ SINON nCaract FIN FIN sSousElement=Gauche(sSourceJson,n) SINON
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 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) 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,"}") 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") Json_Lit(sRes,"result","KO") Json_Lit(sRes,"result/type","KO") Json_Lit(sRes,"result[1]/type","KO") Json_Lit(sRes,"result[2]/type","KO") Json_Lit(sRes,"result[2]/password","KO")
sRes = [ {"success":true,"result":{"type":user,"login":"Cyril","password":"Mon password"}} ]
Json_Lit(sRes,"success","KO") Json_Lit(sRes,"result","KO") Json_Lit(sRes,"result/login","KO") Json_Lit(sRes,"result/password","KO") Json_Lit(sRes,"result[1]/login","KO") Json_Lit(sRes,"result[1]/type","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. |
| |
| |
| | | |
|
| | | | |
| | |
|