Nous utilisons de plus en plus le format JSON. Par exemple, pour enregistrer des paramètres dans un fichier, pour stocker la configuration d’un logiciel, ou pour échanger des données client sur le web avec d’autres serveurs.
Comment pouvez-vous valider que les données reçues sont dans le format attendu? Comment valider que toutes les informations nécessaires sont bien présentes ? Comment faire cette validation sans écrire une méthode fastidieuse pour chaque type de format JSON ?
Il suffit d’écrire un schéma JSON et d’utiliser la commande JSON Validate nouvelle commande !
Préambule
Comme vous le savez peut-être déjà, il existe une différence entre un document XML « bien formé » et un document XML « valide ». Un document XML dont la syntaxe est correcte est appelé « bien formé » et un document XML validé par une DTD est à la fois « bien formé » et « valide ».
Vous pouvez faire de même avec les documents JSON. Vous pouvez écrire un schéma JSON pour décrire votre document JSON. Pour connaître la grammaire et la syntaxe du schéma JSON, je vous conseille de vous rendre sur le site officiel : http://json-schema.org/.
Commande JSON Validate
Avec la commande JSON Parse vous pouvez déjà vérifier que le document JSON est« bien formé ». Depuis 4D v16 R4, la commande JSON Validate vous permet de vérifier que le document JSON est« Valide » selon votre schéma JSON.
La nouvelle JSON Validate renvoie un objet. Dans cet objet, l’attribut « success » est un booléen, sa valeur est vraie lorsque le document est valide et false lorsque le document est invalide par rapport au schéma JSON passé en paramètre. L’attribut « errors » est un tableau d’objets contenant toutes les informations nécessaires pour comprendre et trouver où se trouve l’erreur.
Exemple de code
Par exemple, nous utilisons le schéma JSON suivant varSchema:
{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Person", "type": "object", "properties": { "firstName": { "type": "string" }, "lastName": { "type": "string" }, "gender": { "description": "Gender is M or F", "enum": [ "M","F" ] }, "birthday": { "type": "object", "properties": { "day": {"type": "number"}, "month": {"type": "number"}, "year": {"type": "number"} }, "required": ["day", "month", "year"] } }, "required": ["firstName", "lastName"] }
Nous voulons vérifier si le document JSON suivant varJSON est valide :
{ "firstName": "John", "lastName": "Doe", "gender": "U" }
Nous exécutons donc le code suivant :
C_OBJECT($oJSON;$oSchema;$oResult)
$oJSON :=JSON Parse(varJSON;*) // New * optional parameter
$oSchema :=JSON Parse(varSchema)
$oResult:=JSON Validate($oJSON;$oSchema )
Remarque : lorsque vous validez un fichier JSON, vous souhaitez retrouver facilement la position de l’erreur dans le fichier d’origine. Nous avons donc ajouté un paramètre optionnel » * » à la commande JSON Parse. Dans ce cas, 4D ajoute les informations sur le numéro de ligne et la valeur de décalage pour chaque attribut.
Voici ce qui est renvoyé dans l’objet « $oResult » par la commande JSON Validate commande :
{ "success": false, "errors": [ { "jsonPath": "gender", "line": 4, "offset": 4, "code": 22, "msg": "Error while validating against 'enum' key. \"U\" does not match any enum element in the schema.", "schemaPaths": "properties.gender.enum" } ] }
Note : L’implémentation dans la v16 R4 supporte cette version de la validation du schéma JSON.