PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → JSONVersVariant valide
JSONVersVariant valide
Started by Camus HADDAD ( depem, Dec., 12 2017 11:24 AM - 11 replies
Registered member
841 messages
Popularité : +19 (27 votes)
Posted on December, 12 2017 - 11:24 AM
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
Registered member
165 messages
Popularité : +18 (20 votes)
Posted on December, 12 2017 - 12:11 PM
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
Registered member
841 messages
Popularité : +19 (27 votes)
Posted on December, 12 2017 - 12:37 PM
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
Registered member
96 messages
Popularité : +18 (20 votes)
Posted on December, 12 2017 - 3:05 PM
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 modified, December, 12 2017 - 3:09 PM
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on December, 12 2017 - 8:12 PM
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
Registered member
280 messages
Popularité : +22 (28 votes)
Posted on December, 13 2017 - 2:18 AM
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
Registered member
841 messages
Popularité : +19 (27 votes)
Posted on December, 13 2017 - 5:52 AM
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
Registered member
96 messages
Popularité : +18 (20 votes)
Posted on December, 13 2017 - 6:43 AM
@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 modified, December, 13 2017 - 6:47 AM
Registered member
280 messages
Popularité : +22 (28 votes)
Posted on December, 13 2017 - 10:29 AM
@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
Registered member
257 messages
Popularité : +35 (37 votes)
Posted on December, 05 2019 - 2:32 PM
Voici mon code pour tester la valider d'un JSON :
MonJSON est un JSON = [
{
"TEST1": "DATA1",
"TEST2", "DATA2"
"TEST3": "DATA3",
}
]
Info(VerificationJson(MonJSON))

PROCEDURE INTERNE VerificationJson(LOCAL _JSON est un JSON):booléen
QUAND EXCEPTIONEXCEPTION DANS
SI _JSON.JSONTESTER..Existe = Faux ALORS RENVOYER Vrai
FAIRE
RENVOYER Faux
FIN
FIN


--
Baptiste CLOART
Freelance
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
www.blv-tech.com
Message modified, December, 05 2019 - 2:33 PM
Registered member
324 messages
Popularité : +21 (51 votes)
Posted on December, 05 2019 - 3:08 PM
QUAND EXCEPTIONEXCEPTION DANS
MonVariant est un variant = JSONVersVariant(monjson.json)
FAIRE
Erreur("Json invalide")
FIN


Aucune erreur à propagé, pas d'exception à "réactiver" ect, le code plus simple
Registered member
257 messages
Popularité : +35 (37 votes)
Posted on December, 05 2019 - 4:07 PM
Poncherello a écrit :
QUAND EXCEPTION DANS
MonVariant est un variant = JsonVersVariant(monjson.json)
FAIRE
Erreur("Json invalide")
FIN


Aucune erreur à propagé, pas d'exception à "réactiver" ect, le code plus simple


Désolé mais votre code ne fonctionne pas. Cela retour toujours faux meme avec un JSON valide

--
Baptiste CLOART
Freelance
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
www.blv-tech.com