|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
| Aide sur décodage variant de type Json |
| Débuté par CST, 10 mar. 2020 16:02 - 9 réponses |
| |
| | | |
|
| |
Membre enregistré 6 messages |
|
| Posté le 10 mars 2020 - 16:02 |
Bonjour,
Je dois décoder une structure de type Json. Lorsque j'utilise l'instruction JSONVersVariant de ce que je reçois cela me donne la structure suivante:

Mon problème c'est que les données que je dois interpreter son dans un niveau plus bas que celui que je décode avec l'instruction JSONVersVariant.
sResCode = HTTPDonneRésultat() sResListe est une chaîne ANSI = sResCode //conversion au format JSON permettant de traiter les données soit jz = JSONVersVariant(sResListe) POUR TOUT Ewons DE jz //Boucle sur données de chaque Ewons //Récupération des ID,name,EncodedName, Status,Description,customAttributes,m2webServer,LanDevices,ewonService FIN
Je m'attendais à pouvoir définir une structure permettant de stocker les données en boucle:
//Données ewon STEwon est une Structure Id est un entier sName est une chaîne sEncodedName est une chaîne bStatus est un booléen sDescription est une chaîne sM2webServer est une chaîne sLanDevices est une chaîne sEwonServices est une chaîne FIN
Mais je ne sais pas comment lier cette structure dans ma boucle.... Merci |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 000 messages |
|
| Posté le 10 mars 2020 - 16:10 |
Bonjour,
STEwon est une Structure Id est un entier<serialise="id"> sName est une chaîne <serialise="name"> sEncodedName est une chaîne <serialise="encodedName"> bStatus est un booléen<serialise="status"> sDescription est une chaîne<serialise="description"> sM2webServer est une chaîne<serialise="m2webserver"> sLanDevices est une chaîne<serialise="lanDevices"> sEwonServices est une chaîne<serialise="ewonServices"> FIN
sResCode = HTTPDonneRésultat() sResListe est une chaîne ANSI = sResCode //conversion au format JSON permettant de traiter les données soit jz = JSONVersVariant(sResListe) MesEwon est un tableau de STEwon quand exception dans deserialise(MesEwon,jz.ewons,psdjson) faire fin POUR TOUT Ewons DE MesEwon trace(Ewons.ID,Ewons.Name) ///etc FIN
JordanMessage modifié, 10 mars 2020 - 16:16 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
| Posté le 11 mars 2020 - 08:58 |
Bonjour, Merci pour le code que je n'aurais vraiment pas trouvé tout seul ! Par contre, je ne sais pas s'il a déjà fonctionné, mais sur mon poste j'ai une erreur sur l'instruction suivante:
Désérialise(MesEwon,jz.ewons,psdJSON)
"Le passage du paramètre 2 à provoqué une erreur. Un element de type Membrevariant ne peut être converti vers le type vide"
jz.ewons à bien récupéré un tableau de variant correspondant à la structure de type STEwon (c'est déjà une bonne chose) seule différence, dans la structure, on n'a pas définie "customAttributes" qui est aussi un tableau de 3 chaines, est-ce là l'origine de l'erreur ?

|
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 000 messages |
|
| Posté le 11 mars 2020 - 09:59 |
Bonjour,
Essaye simplement
MesEwon = jz.ewons
au lieu de
Désérialise(MesEwon,jz.ewons,psdJSON)
Jordan |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
| Posté le 11 mars 2020 - 11:41 |
Dans ce cas, il ne récupère pas les toutes les données...: jz.ewons:

Ewons:

|
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 000 messages |
|
| Posté le 11 mars 2020 - 12:58 |
Il faut que tu renomme les variable de ta structure exactement comme il sont écris dans ta réponse
sname devient Name sencodedName devient encodedName Etc
La élément <serialise=""> que je t'ai rajouter dans ta structure de ne serve qu'à la fonction deserialise, tu peux donc les supprimer
Jordan |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
| Posté le 11 mars 2020 - 13:07 |
Jordan, Fait.... mais erreur sur l'affectation MesEwon = jz.ewons
"Un élément de type 'MembreVariant' ne peut pas être converti vers le type 'chaîne ANSI'."
Est-ce que la donnée "customAttributes" qui est un tableau de 3 chaines ne manquerait pas dans la déclaration de la structure STEwon ? J'ai essayé de rajouter dans la structure mais cela ne change rien à l'erreur... STEwon est une Structure Id est un entier //<serialise="id"> name est une chaîne // <serialise="name"> encodedName est une chaîne // <serialise="encodedName"> status est un booléen // <serialise="status"> description est une chaîne // <serialise="description"> customAttributes est un tableau de 3 chaînes m2webServer est une chaîne // <serialise="m2webserver"> lanDevices est une chaîne // <serialise="lanDevices"> ewonServices est une chaîne //<serialise="ewonServices"> FIN |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 953 messages |
|
| Posté le 11 mars 2020 - 14:42 |
bonjour CST,
il y a un soucis dans la déclaration de votre structure.
Si vous regardez bien le premier aperçu écran que vous avez posté , il y a un petit tableau bleu en bas à gauche de certain cube vert ( c'est très imagé oui ) Cela signifie qu'il s'agit de tableau.
Donc jz.ewons est considéré comme un tableau, customAttributes également, mais ! lanDevices ewonDevices sont eux aussi des tableaux.
Donc perso je déclarerai votre structure ainsi :
STEwon est une structure Id est un entier name est une chaîne encodedName est une chaîne status est un booléen Description est une chaîne customAttributes est un Variant m2webServer est une chaîne lanDevices est un Variant ewonServices est un Variant FIN
avec des variants.
Mais avant tous, je souhaitai juste savoir pourquoi est-ce que vous vous embêtez à tout basculer dans un tableau de structure, alors que votre variable JZ contient déjà toutes les données ?
vous pouvez analyser directement votre variable JZ , çà me parait 'lourd' de retransférer le tout dans d'autre variables... mais après je connais pas votre logiciel...
cordialement et bon dèv  |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
| Posté le 11 mars 2020 - 16:41 |

Effectivement, ça marche mieux comme ça. Concernant l'idée de base, c'était pouvoir associer la structure et donc pouvoir accéder rapidement à une des composantes (le nom, le status, etc...) Dans le but de pouvoir ensuite balayer dans la boucle:
MesEwon = jz.ewons POUR TOUT Ewons DE MesEwon Trace(Ewons.Id,Ewons.name) ///etc //Traitement associé à l'état des boitiers SI Ewons.status ALORS //gestion d'affichage et traitement associé au boitier en ligne FIN FIN Après, n'étant pas à l'aise avec les données au format Json, j'avoue que je tatone beaucoup  |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 953 messages |
|
| Posté le 11 mars 2020 - 17:38 |
ok je vois
donc le plus simple, c'est de sauvegarder le résultat d'un appel à votre API, vous le sauvegardez en 'get_ewons_JSON.json' par exemple , comme vous voulez.
par exemple : ( a ne faire qu'une seule fois )
sResCode = HTTPDonneRésultat() fSauveTexte(SysRep(srBureau)+["\"]+"get_ewons_JSON.json",srescode)
Le but est d'ajouter ce fichier JSON dans votre projet Windev. Clic droit sur Descriptions Externes , ajouter un fichier XML / JSON Sélectionnez votre fichier. Grâce à çà, lorsque vous déclarerez une variable JSON en lui indiquant la description, vous retrouverez la liste des membres et la saisie de code sera grandement simplifiée.
Ensuite, modifiez votre code
// Dans description resaisissez le nom qui apparaitra dans le treeview de Windev, si vous l'avez nommé autrement sResJSON est un JSON <description="get_ewons_JSON">
sResJSON = HTTPDonneRésultat()
POUR _id_ewon=1 _A_ sResJSON.ewons..Occurrence trace(sResJSON.ewons[_id_ewon].ID,sResJSON.ewons[_id_ewon].Name) ///etc FIN
(modif car le forum n'affiche pas tout le code )
Testez déjà çà, ensuite vous pouvez également créer un autre fichier JSON en copiant collant juste le bout du json décrivant un EWON .
bon dèv.Message modifié, 11 mars 2020 - 17:39 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|