PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WEBDEV (versiones precedentes) → Comment connaitre la structure d'un enregistrement JSON?
Comment connaitre la structure d'un enregistrement JSON?
Iniciado por Jose Dubois, 23,feb. 2021 16:21 - 6 respuestas
Publicado el 23,febrero 2021 - 16:21
Bonjour,

Je peux parcourir les données de l'enregistrement avec .Membre mais je n'ai pas trouvé comment parcourir la structure, par exemple, j'obtiens facilement la valeur 2 si je connais le membre cdrvoicemail dans l'enregistrement partiel suivant mais comment connaître l'élément "cdrvoicemail" si j'ignore la structure?

{"server_name":"RNT Inc","tenantcode":"999","package_id":"5","glocomproxy":null,"absolutetimeout":"14400","cdrvoicemail":"2","faxformat":"letter","faxfiletype":"1"

Merci d'avance!

JD
Publicado el 23,febrero 2021 - 17:13
je ne sais pas s'il y a une fonction json spécifique pour ca, mais en tous les cas, un json est juste un foichier de chaines, et donc extratichaine peut extraire tous les éléments
Miembro registrado
212 mensajes
Publicado el 23,febrero 2021 - 19:05
Publicado el 23,febrero 2021 - 21:30
Merci! En passant j'ai trouvé ceci qui répond non seulement à toutes mes questions sur l'analyse d'un enregistrement JSON mais qui en plus utilise une procédure interne avec la récursivité. Du beau code.

https://blogs.pcsoft.fr/fr/extraire-simplement-donnees-json-dont-structure-connue-avance/353/read.awp

Merci encore!
Publicado el 24,febrero 2021 - 11:04
Et donc encore une fois un exemple qui montre ce qu'il ne faut surtout PAS faire dans la vrai vie...

La récursivité est officiellement NON supportée en wlanguage.

Ca fonctionne, oui, mais le nombre de 'tours' que tu peux effectuer avant que ton programme explose est :
- Faible
- TRES différent selon les versions (le maximum que j'ai trouvé quand je faisais des tests était 600 niveaux, et c'est descendu à 128 la version d'après)

Fais une simple boucle récursive qui compte et fait un trace de la valeur et tu verras par toi même le crash spectaculaire...

Donc cet exemple va fonctionner tant que la structure du json est simple ET tu ne l'appelles pas depuis quelque part qui est déjà très profond dans la pile des appels...

Donc, fais de la récursivité si tu veux ne jemais savoir si ton programme va planter ou pas quand tu passes à la nouvelle version, ou quand tu appelle ton code depuis quelque part ailleurs.
Miembro registrado
743 mensajes
Publicado el 26,febrero 2021 - 15:30
Bonjour,

sJSon est une chaîne ANSI = [
{
"Membre1": "Valeur Membre 1",
"Membre2": "Valeur Membre 2",
"Membre3": "Valeur Membre 3",
"Membre 4": {
"Membre 5": {
"Membre 6": 6,
"Membre 7": "Valeur Membre 7"
},
"Membre 8": {
"Membre 9": 9,
"Membre 10": "Valeur Membre 10"
}
}
}
]

soit vjs = JSONVersVariant(sJSon)

POUR TOUT _Membre DE vjs..Membre

SI _Membre..Membre..Occurrence = 0 ALORS
Trace("Le membre " + _Membre..Nom + " a la valeur " + _Membre..Valeur)
SINON
Trace("Le membre " + _Membre..Nom + " a " + _Membre..Membre..Occurrence + ...
" autres membres")
ParcoursMembresVariant(_Membre)
FIN
FIN

PROCÉDURE INTERNE ParcoursMembresVariant(x)

POUR TOUT _Membre DE x..Membre
SI _Membre..Membre..Occurrence = 0 ALORS
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + ...
"Le membre " + _Membre..Nom + " a la valeur " + _Membre..Valeur)
SINON
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + ...
"Le membre " + _Membre..Nom + " a " + _Membre..Membre..Occurrence + ...
" autres membres...")
ParcoursMembresVariant(_Membre)
FIN
FIN
FIN


Vu ici : https://doc.pcsoft.fr/fr-fr/?1000021296&name=jsonversvariant_fonction

jordan
Miembro registrado
84 mensajes
Publicado el 27,febrero 2021 - 13:33
Bonjour

Je me suis permis d'ajouter la notion de "tableau" :-)

PROCÉDURE INTERNE ParcoursMembresVariant(x)
sListeValeurs est une chaîne
POUR TOUT _Membre DE x..Membre
SI _Membre..Membre..Occurrence = 0 ALORS
SI (_Membre..Type <> wlVariantTableau ) ALORS
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "Le membre " + _Membre..Nom + " a la valeur " + _Membre..Valeur)
SINON
sListeValeurs = ""
POUR TOUT cellule DE _Membre
sListeValeurs += cellule + ","
FIN
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "Le membre " + _Membre..Nom + " a pour valeur " + sListeValeurs)
FIN
SINON
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + ...
"Le membre " + _Membre..Nom + " a " + _Membre..Membre..Occurrence + " autres membres...")
ParcoursMembresVariant(_Membre)
FIN
FIN

FIN