PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Aide sur décodage variant de type Json
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

Jordan
Message 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 :D )
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 //<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 Variant
m2webServer est une chaîne // <serialise="m2webserver">
lanDevices est un Variant // <serialise="lanDevices">
ewonServices est un Variant //<serialise="ewonServices">
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
:merci:

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