PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 24 → JSONVersVariant valide
JSONVersVariant valide
Débuté par Camus HADDAD ( depem, 12 déc. 2017 11:24 - 8 réponses
Membre enregistré
838 messages
Popularité : +5 (9 votes)
Posté le 12 décembre 2017 - 11:24
Bonjour,

JSONversvariant converti un Json en variant mais si le Json est invalide ou si une erreur de transmission de donnés se produit cette fonction crée une erreur fatal.
Y a t'il un moyen de vérifier la validité du Json ? personnellement je n'en n'ai pas trouvé

Merci

--
Cordialement,
Camus
Membre enregistré
157 messages
Popularité : +1 (1 vote)
Posté le 12 décembre 2017 - 12:11
Bonjour,

Si le JSON est invalide, JSONVersVariant lève une exception (comme vous l'indiquez).
Il suffit donc de gérer les exceptions pour cet appel pour traiter le cas où le JSON est incorrect

vSourceJSON est un Variant
QUAND EXCEPTIONEXCEPTION DANS
// Transforme le code source JSON
vSourceJSON = JSONVersVariant(sSourceJSON)
// vSourceJSON est rempli si le JSON est valide
...
FAIRE
// Traitement à faire si le JSON est invalide
...
FIN
Membre enregistré
838 messages
Popularité : +5 (9 votes)
Posté le 12 décembre 2017 - 12:37
Merci,

J'y avais pensé mais je suis déjà dans un cycle EXCEPTION ou je gère d'autres problèmes. L'idéal aurait été que cette fonction renvoie 0 ou -1 en cas d'erreur.
J'ai contourné le problème en validant la présence dans le texte retourné de 2 variables qui devraient s'y trouvé.

Merci

--
Cordialement,
Camus
Membre enregistré
94 messages
Posté le 12 décembre 2017 - 15:05
En se basant sur le code de Jarod, on peut créer une fonction JSonVersVariantPerso et gérer l'erreur par ErreurDéclenche.

Procedure JSonVersVariantPerso(CodeJson)
Résultat est un variant
QUAND EXCEPTIONEXCEPTION DANS
Résultat = JSONVersVariant(CodeJson)
FAIRE
ErreurDéclenche(1, ExceptionInfo())
FIN
RENVOYER Résultat


Et pour l'utiliser

MonVariant est un variant = JSonVersVariantPerso(CodeJson)
SI ErreurDétectée ALORS
....
SINON
....
FIN


La fonction renvoie toujours le variant, mais vous avez le moyen de détecter l'erreur. Qu'en pensez-vous ?

--
Johjo aka Jonathan Laurent

Mon blog sur WinDev : http://blog.ytreza.org
Me contacter par Twitter : @Johjo07
Message modifié, 12 décembre 2017 - 15:09
Membre enregistré
727 messages
Posté le 12 décembre 2017 - 20:12
Coucou,

Carrement inspirer de ce que vous avez dit, mais je serais plus parti sur un truc comme sa

Du coup le MonVariant est un variant sera a null

On peut toujours utiliser le ErreurDétectée si on laisse ErreurPropage() ou ExceptionPropage(), et sinon tester si le variant et null si on les enleves ?
Votre avis?

Procedure JSonVersVariantPerso(_sCodeJSon)
// Automatic behavior
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)

_vSourceJSON est un Variant = JSONVersVariant(_sCodeJSon)
// Summary
RENVOYER _vSourceJSON
CAS ERREUR:
ErreurPropage()
RENVOYER Null
CAS EXCEPTION:
ExceptionPropage()
RENVOYER Null


--
In üs we trust - Joyeux noël
Membre enregistré
280 messages
Popularité : +8 (10 votes)
Posté le 13 décembre 2017 - 02:18
Bonjour,

Pour compléter ce que Charly et Johjo ont dit :
Dans le cas d'une erreur exceptionnelle si ce code doit servir de façon redondante dans l'application il ne faut pas oublier
ExceptionActive()


--
Cordialement.
Je vous souhaite une bonne journée depuis le Vietnam.

Olivier.
http://www.impulse-web.com
Membre enregistré
838 messages
Popularité : +5 (9 votes)
Posté le 13 décembre 2017 - 05:52
Je vous remercie à tous,

Effectivement il serait judicieux de réécrire une procédure perso.
Je ne comprend d'ailleurs pas que Windev n'y ai pas pensé. De plus en plus de WebService REST sont utilisés et on n'est pas à l'abris d'une panne réseau au moment du retour

Bonne journée

--
Cordialement,
Camus
Membre enregistré
94 messages
Posté le 13 décembre 2017 - 06:43
@Charly :
Je ne connaissais pas cette méthode de gestion des erreurs et des exceptions, merci.
Je suis tout à fait d'accord avec toi, le fait de renvoyer explicitement null est une bonne idée.
Par contre, je suis moins d'accord avec les points suivants :
- à ma connaissance, VariantVersJSon ne déclenche pas d'erreur. Du coup, la partie de gestion des erreurs ne fonctionnera pas.
- si tu propage l'exception, la valeur de retour null ne sera jamais renvoyée (ExceptionPropage force la sortie du traitement sans renvoyer de valeur).
- deuxième point sur la propagation de l'exception, il faudra quand même la gérer dans le traitement appelant
- Je n'ai pas testé, mais ne faut-il pas utiliser un ExceptionRestaureParamètre avant de propager l'exception ? Afin d'éviter de partir en boucle infinie ?

@Olivier :
Le ExceptionActive permet de remettre en place le système d'exception, c'est bien ça ? J'ai testé et j'ai l'impression que c'est utile quand on utilise la syntaxe QUAND EXCEPTION ... FIN (sans le DANS et le FAIRE). J'ai l'impression que la syntaxe QED ... FAIRE ... FIN permet d'empiler les exceptions (enfin, mes tests me montre que ça marche). Aurais-tu un exemple que je puisse voir ?

@Tous :
Du coup, pour ma part, je reste sur ce code :
Procedure JSonVersVariantPerso(CodeJson)
Résultat est un variant = Null
QUAND EXCEPTIONEXCEPTION DANS
Résultat = JSONVersVariant(CodeJson)
FAIRE
ErreurDéclenche(1, ExceptionInfo())
FIN
RENVOYER Résultat


ou selon la méthode de Charly (mais avec mon style d'écriture)

Procedure JSonVersVariantPerso(CodeJson)
ExceptionChangeParamètre(epGotoCasException)

Résultat est un Variant = Null
Résultat = JSONVersVariant(CodeJson)

CAS EXCEPTION :
ErreurDéclenche(1, ExceptionInfo())

RENVOYER Résultat


Si on peut encore améliorer ce code, n'hésitez pas !

Edit :
Inutile d'utiliser ExceptionRestaureParamètre, ExceptionPropage semble ignorer le "CAS EXCEPTION :" mais l'exception reste à gérer.
--
Johjo aka Jonathan Laurent

Mon blog sur WinDev : http://blog.ytreza.org
Me contacter par Twitter : @Johjo07
Message modifié, 13 décembre 2017 - 06:47
Membre enregistré
280 messages
Popularité : +8 (10 votes)
Posté le 13 décembre 2017 - 10:29
@Johjo
Oui Le ExceptionActive permet de remettre en place le système d'exception.

D'après la DOC:
Rappel : Un traitement d'exception du WLangage ne peut servir qu'une seule fois (ceci permet d'éviter des boucles sans fin si l'exception n'est pas correctement corrigée). La fonction ExceptionActive permet de réactiver le traitement d'exception : une autre exception pourra donc être traitée par le traitement.

Voici mon code :
Procedure JSON_Valider(sJSON_Data est une chaîne ANSI)
_Réponse est un Variant
QUAND EXCEPTIONEXCEPTION DANS
_Réponse=JSONVersVariant(sJSON_Data)
FAIRE
_Réponse=-1+RC+ExceptionInfo(errMessage)
ExceptionActive()
FIN
RENVOYER _Réponse


--
Cordialement.
Je vous souhaite une bonne journée depuis le Vietnam.

Olivier.
http://www.impulse-web.com