Les Services WEB EXTERNES PARAMETRABLES
Principe et périmètre
Diapason dispose d’un ensemble d’outils permettant l’utilisation de Services Web Externes. Il permet donc d’échanger des données au format (JSON, XML ou autre) avec des API de type REST externe à Diapason. Les verbes GET POST PUT et DELETE seront gérés.
Ces outils sont entièrement basés sur l’utilisation de fonction et de liste DIALOG pour permettre de couvrir simplement le plus grand nombre d’api possible.
Une nouvelle fonction DIALOG permettra donc de définir, d’exécuter et de récupérer les résultats d’une requête http.
De plus, la manipulation de données au format JSON sera facilitée grâce à l’utilisation de nouvelles listes et fonctions DIALOG.
Le format JSON est certainement le plus répandu à ce jour mais les outils de manipulation de données XML et Texte (déjà existants en DIALOG) seront aussi utilisables simplement pour définir une demande ou interpréter les résultats si nécessaire.
Outils de définition et d’exécution d’une requête HTTP
Les différents éléments d’une requête http
L’exécution d’une requête http dans Diapason peut être symbolisée avec le schéma suivant :
![](../__attachments/115229542/image-20230307-145310.png?inst-v=2e0628d9-a170-4eb1-b774-b0d7a84fa1a1)
Les différents éléments pris en compte pour l’exécution d’une requête http peuvent être rangés en deux catégories.
Ceux qui interviennent pour la définition de la demande appelée « Requête » :
URL (détermine en réalité l’URI qui permet d’identifier la ressource sur un réseau)
Query Parameters (détermine la suite de paramètres passés à la suite de l’URL)
Les Headers (déterminent une liste de Headers sous la forme CLE / VALEUR)
Le verbe (détermine le verbe de la demande GET POST PUT et DELETE)
Le Body (détermine le contenu principal de la demande. Il peut être au format JSON, XML, TEXTE).
L’exécution de la requête donnera lieu à une « réponse » qui permettra de récupérer les éléments suivants :
Le Code retour (Permet de recevoir le code de retour en cas d’erreur du serveur distant)
Les Headers (Possibilité de récupérer la valeur d’un Header de retour à partir de sa CLE)
Le Body (Permet de récupérer et de traiter le contenu du body de la réponse à la requête)
Généralités sur la fonction DIALOG SW-REQUETE-HTTP
L’ensemble des fonctionnalités spécifiques à l’exécution d’une requête http passe par l’utilisation de la fonction DIALOG « SW-REQUETE-HTTP ». Le premier paramètre déterminera l’action à réaliser.
Comme pour la plupart de fonction DIALOG, il conviendra de tester pour chaque utilisation la valeur de retour pour s’assurer qu’il n’y a pas eu d’erreur.
Vous pouvez alors répercuter cette erreur dans Diapason sous la forme souhaitée (un LC-ERREUR par exemple).
Voici un exemple d’utilisation de la fonction SW-REQUETE-HTTP :
COMMENTAIRE : "Exemple de réinitialisation d'une requête HTTP"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= REINIT )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur de réinitialisation :" + " " + VLO.RetourFonction
FIN_BLOC
Définition des paramètres d’envoi d’une requête http
Voici la liste des actions permettant de caractériser les paramètres d’envoi d’une requête http.
L’utilisation successive de la fonction SW-REQUETE-HTTP permettra de déterminer et de mémoriser l’ensemble des caractéristiques qui seront prises en compte lors de l’exécution effective de la requête.
Pour cette raison, si vous souhaitez exécuter plusieurs requêtes http dans la même requête DIALOG, il conviendra d’utiliser l’action REINIT pour purger les caractéristiques précédemment utilisées dans une même requête DIALOG. (Voir paragraphe « Autres fonctionnalités »)
L’URL et le Verbe
L’URL et le Verbe sont les deux paramètres qui seront donnés lors de la demande d’exécution de requête. (Voir paragraphe « Exécution d’une requête http »
Les Query Parameters
Les « Query Parameters » ou « Query string » sont des paramètres passés dans la chaine de caractère de l’URL. Ils sont placés à la fin de l’URL sous la forme suivante :
![](../__attachments/115229542/image-20230307-145402.png?inst-v=2e0628d9-a170-4eb1-b774-b0d7a84fa1a1)
Dans DIAPASON, les Query Parameters peuvent techniquement être donnés avec l’url au moment de l’exécution de la requête http. Il est toutefois fortement conseillé d’utiliser la fonction DIALOG spécifique permettant de rajouter des query parameter car cette dernière va gérer la transformation éventuelle des caractères interdits.
C’est l’action « PUT-PARAM » de la fonction SW-REQUETE-http qui devra être utilisée plusieurs fois si vous voulez définir plusieurs paramètres.
Voici un exemple d’utilisation de l’action PUT-PARAM :
COMMENTAIRE : "Exemple d'ajout de paramètre à une requête HTTP"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= PUT-PARAM , CLE-PARAM= CLO."access_key" , VAL-PARAM= CLO."Ma_Cle_Perso" )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur sur le paramètre" + " " + CLO."access_key" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Les Headers
Les headers forment un ensemble de paramètres sous la forme Clé / Valeur.
L’action « PUT-HEADER » devra être utilisée plusieurs fois si vous voulez définir plusieurs headers.
Voici un exemple d’utilisation de l’action PUT-HEADER :
COMMENTAIRE : "Exemple d'ajout du header 'Content-Type' avec la valeur 'application/json'"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= PUT-HEADER , CLE-HEADER= CLO."Content-Type" , VAL-HEADER= CLO."application/json" )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'ajout du Header" + " " + CLO."Content-Type" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Remarque : Les headers spécifiques d’authentification seront gérés avec une action dédiée comme indiqué dans le paragraphe ci-dessous.
Les paramètres d’authentification
L’authentification des requêtes http passe généralement par des headers avec un format spécifique. Il est donc conseillé d’utiliser l’une des deux actions spécifiques d’authentification :
L’action PUT-BASICAUTH qui reçoit le login et le mot de passe ajoute un Header de type BasicAuth (encodé en base 64).
Voici un exemple d’utilisation de l’action PUT-BASICAUTH :
COMMENTAIRE : "Exemple d'authentification du type BasicAuth pour une requête HTTP"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= PUT-BASICAUTH , LOGIN= CLO."MonLogin" , PASSWORD= CLO."Mot2Passe" )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'authentification" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
L’action PUT-BEARERAUTH qui reçoit la clé « BEARER » ajoute un Header de type Bearer.
Voici un exemple d’utilisation de l’action PUT-BEARERAUTH :
COMMENTAIRE : "Exemple d'authentification du type Bearer pour une requête HTTP"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= PUT-BEARERAUTH , PASSWORD= CLO."486a7bb7212252de1a938c230a10f977" )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'authentification" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Le Body
Le body va contenir l’information principale du message envoyé. Le volume de cette information est très souvent trop important pour être stocké dans une variable.
Le format JSON est certainement le plus utilisé mais le format XML est aussi utilisé dans certains cas.
Afin de faciliter au maximum le paramétrage, Diapason permet d’alimenter le body directement à partir des structures de description XML, Texte ou la nouvelle liste de description JSON. Afin de couvrir un maximum de cas, il sera aussi possible d’alimenter le body à partir d’un fichier libre.
Voici donc les quatre formats possibles :
Format JSON
Voici un exemple d’alimentation du body à partir de la liste WFSWListeJSON. La manipulation des données au format JSON sera présentée dans un paragraphe spécifique de ce document.
COMMENTAIRE : "Exemple d'alimentation du body avec un format JSON"
COMMENTAIRE : "Alimentation de la liste WFSWListeJSON à partir d'un fichier 'Modèle'."
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= IMPORTER-FICHIER , PATH-FIC= CLO."/tmp/FichierModele.json" , OPTION= CLO."" )
COMMENTAIRE : "On remplace certaines valeurs par les valeurs souhaitées."
POUR CHAQUE LST WFSWListeJSON AVEC WFSWListeJSON.ValeurCarElement = CLO."$A_REMPLACER$" :
PRENDRE WFSWListeJSON ValeurCarElement = CLO."ISSWDG_SOR"
FIN_BLOC
COMMENTAIRE : "Alimentation du body à partir de la liste WFSWListeJSON."
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= PUT-BODY , FORMAT= JSON )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'alimentation du Body :" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Format XML
Voici un exemple d’alimentation du body à partir de la liste WFEIAXmlMes. L’utilisation des outils de manipulation des données au format XML existants (correspondance, lecture de fichier…) permet d’alimenter la liste WFEIAXmlMes. Par la suite, il suffit d’utiliser l’action PUT-BODY avec le FORMAT XML pour alimenter le body avec le contenu XML de cette description.
COMMENTAIRE : "........On part du principe que la liste WFEIAXmlMes est alimentée avec une structure XML valide"
COMMENTAIRE : "Alimentation du body à partir de la liste WFEIAXmlMes."
VLO.RetourFonction = SW-REQUETE-HTTP(ACTION= PUT-BODY , FORMAT= XML , CLE= CLO."CLEXML")
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'alimentation du Body :" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Format TEXTE
Voici un exemple d’alimentation du body à partir de la liste WFFicContenu. L’utilisation des outils de manipulation des données au format TEXTE existants (lecture de fichier…) permet d’alimenter la liste WFFicContenu. Par la suite, il suffit d’utiliser l’action PUT-BODY avec le FORMAT TEXTE pour alimenter le body avec le contenu texte de cette description.
COMMENTAIRE : "........On part du principe que la liste WFFicContenu est alimentée"
COMMENTAIRE : "Alimentation du body à partir de la liste WFFicContenu."
VLO.RetourFonction = SW-REQUETE-HTTP(ACTION= PUT-BODY , FORMAT= TEXTE, CLE= CLO."CLETEXTE")
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'alimentation du Body :" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Format FICHIER
Voici un exemple d’alimentation du body avec un format totalement libre. Il vous suffit de générer le format souhaité dans un fichier et d’utiliser l’action PUT-BODY avec le format FICHIER comme ci-dessous :
COMMENTAIRE : "Alimentation du body à partir d'un fichier (au format libre)."
VLO.RetourFonction = SW-REQUETE-HTTP(ACTION= PUT-BODY , FORMAT= FICHIER, PATH= CLO."/tmp/FichierAImporter")
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Erreur d'alimentation du Body :" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Exécution d’une requête http
Après avoir défini les paramètres d’envoi de la requête http comme spécifié dans l’API que vous souhaitez utiliser, vous pouvez exécuter votre demande avec l’action EXE-REQUETE de la fonction SW-REQUETE-http.
Les paramètres d’exécution
C’est lors de cet appel que vous allez spécifier les deux seules informations obligatoires pour toutes requêtes http : le verbe et l’URL.
Le Verbe (paramètre « METHODE »)
Le verbe va permettre de spécifier la méthode d’accès à la ressource. Diapason permet d’utiliser les méthodes les plus courantes : GET PUT POST et DELETE.
Vous devez donc valoriser le paramètre « METHODE » comme il vous sera spécifié dans la documentation de l’API que vous voulez utiliser.
L’URL
Le paramètre « URL » va permettre de spécifier comment accéder à la ressource. Là encore, vous trouverez cette information dans la documentation de l’API que vous voulez utiliser.
Remarque : Il est préférable de ne pas ajouter les « query paramètres » à la fin de l’URL. Vous devez utiliser l’action « PUT-PARAM » comme documenté plus haut.
Voici un exemple d’utilisation du EXE-REQUETE :
COMMENTAIRE : "........On part du principe que vous avez défini les paramètres d'envoi de la requête http comme spécifié dans l'API que vous souhaitez utiliser."
COMMENTAIRE : " Exemple d'utilisation de l'action EXE-REQUETE avec la méthode GET"
VLO.URL = CLO."https://geo.api.gouv.fr/departements/64/communes"
VLO.RetourFonction = SW-REQUETE-HTTP(ACTION= EXE-REQUETE , METHODE= GET , URL= VLO.URL)
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO." Erreur d'exécution de la requête :" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Les valeurs de retour
Généralités sur le code de retour
Toute exécution de requête http va donner lieu à un code de retour. C’est une valeur numérique de type entier qui va suivre certaines normes.
La plage des entiers entre 200 et 299 va être utilisée dans le cas ou la requête s’est bien passée. Ainsi dans la très grande majorité des cas, c’est le code 200 qui sera retourné en cas de succès.
Les autres valeurs vont être utilisées pour les différents cas d’erreur. Les cas d’erreurs sont généralement décrits dans la documentation de l’API que vous souhaitez utiliser.
La valeur de retour du EXE-REQUETE
Valeur OK
Pour uniformiser les valeurs de retour des fonction DIALOG, l’action EXE-REQUETE retournera une chaine vide pour les cas de succès (code 200).
Valeur KO
Dans un cas d’erreur, le code retour sera retourné dans la chaine de caractères. Ce code pourra être suivi d’une description d’erreur dans le cas d’une erreur interne à Diapason.
Les cas d’erreurs sont généralement décrits dans la documentation de l’API que vous souhaitez utiliser. Dans certains cas d’API, vous trouverez des informations complémentaires dans le body de retour. Si c’est le cas, vous devrez utiliser l’action GET-BODY pour récupérer ces informations détaillées. (Voir paragraphe ci-dessous)
Récupération des paramètres de retour d’une requête http
Le code de retour étant passé dans la chaine de retour de l’action EXE-REQUETE, il reste deux paramètres pouvant contenir des informations : les headers et le body. (Voir schéma général de début de chapitre)
Les Headers de retour
Dans certains cas, la requête http va vous retourner des informations sous la forme de Header. Par exemple, il est fréquent que l’API retourne un Header « Content-Type » qui va vous indiquer le type ou le format de la réponse stockée dans le body de retour.
L’action GET-HEADER vous permet de récupérer la valeur d’un Header donné dans une variable de type caractère.
Voici un exemple d’utilisation de l’action GET-HEADER :
COMMENTAIRE : "........On part du principe que vous avez utilisé l'action EXE-REQUETE au préalable."
COMMENTAIRE : "Exemple de récupération du Header Content-Type dans la variable ValHeader en retour de l'exécution de la requête HTTP."
VLO.RetourFonction = SW-REQUETE-HTTP(ACTION= GET-HEADER , CLE-HEADER= CLO."Content-Type" , S:VALEUR= VLO.ValHeader)
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO. "Problème avec le Header Content-Type :" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Le body de retour
Le body va contenir l’information principale du retour de l’exécution de la requête HTTP. Le volume de cette information est très souvent trop important pour être stocké dans une variable.
Le format JSON est certainement le plus utilisé mais le format XML est aussi utilisé dans certains cas.
Afin de faciliter au maximum le paramétrage, Diapason permet d’alimenter les structures de description XML, Texte ou la nouvelle liste de description JSON à partir du body de retour. Pour couvrir un maximum de cas, il sera aussi possible d’enregistrer son contenu dans un fichier.
Voici donc les quatre formats possibles :
Format JSON
Voici un exemple d’alimentation de la liste WFSWListeJSON à partir du body de retour. La manipulation des données au format JSON sera présentée dans un paragraphe spécifique de ce document.
COMMENTAIRE : "........On part du principe que vous avez utilisé l'action EXE-REQUETE au préalable."
COMMENTAIRE : "Exemple de récupération du Body au format JSON après l'exécution de la requête HTTP."
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= GET-BODY , FORMAT= JSON )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Problème de récupération du body" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
SINON
POUR CHAQUE LST WFSWListeJSON :
COMMENTAIRE : "Possibilité de récupérer les informations du body ici."
FIN_BLOC
FIN_BLOC
Format XML
Voici un exemple d’alimentation de la liste WFEIAXmlMes à partir du body de retour. Les outils existants de manipulation des données au format XML (correspondance, écriture de fichier…) sont utilisables par la suite.
COMMENTAIRE : "........On part du principe que vous avez utilisé l'action EXE-REQUETE au préalable."
COMMENTAIRE : "Exemple de récupération du Body au format XML après l'exécution de la requête HTTP."
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= GET-BODY , FORMAT= XML , CLE= CLO."CLEXML")
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Problème de récupération du body" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
SINON
POUR CHAQUE LST WFEIAXmlMes :
COMMENTAIRE : "Possibilité de récupérer les informations du body ici."
FIN_BLOC
FIN_BLOC
Format TEXTE
Voici un exemple d’alimentation de la liste WFFicContenu à partir du body de retour. Les outils existants de manipulation des données au format TEXTE (écriture de fichier…) sont utilisables par la suite.
COMMENTAIRE : "........On part du principe que vous avez utilisé l'action EXE-REQUETE au préalable."
COMMENTAIRE : "Exemple de récupération du Body au format TEXTE après l'exécution de la requête HTTP."
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= GET-BODY , FORMAT= TEXTE , CLE= CLO."CLETEXTE")
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Problème de récupération du body" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
SINON
POUR CHAQUE LST WFFicContenu :
COMMENTAIRE : "Possibilité de récupérer les informations du body ici."
FIN_BLOC
FIN_BLOC
Format FICHIER
Voici un exemple d’enregistrement du body de retour dans une fichier.
COMMENTAIRE : "........On part du principe que vous avez utilisé l'action EXE-REQUETE au préalable."
COMMENTAIRE : " Exemple de récupération du Body dans un fichier après l'exécution de la requête HTTP."
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= GET-BODY , FORMAT= FICHIER , PATH= CLO."/tmp/NomFichierBodySortie")
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Problème de récupération du body" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Autres fonctionnalités
Voici la liste des autres fonctionnalités de la fonction DIALOG « SW-REQUETE-http ».
REINIT
L’action REINIT permet de supprimer toutes les caractéristiques et tous les résultats précédemment obtenus par l’utilisation de la fonction SW-REQUETE-http dans la même requête DIALOG.
Il conviendra donc d’utiliser l’action REINIT si vous voulez utiliser plusieurs fois l’action «EXE-REQUETE» dans une même requête. Il faudra le placer avant de commencer à définir les caractéristiques de la nouvelle demande.
COMMENTAIRE : "Exemple de réinitialisation pour permettre de définir et d'exécuter une nouvelle requête HTTP."
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= REINIT )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO." Problème de réinitialisation " + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
NIV-TRACE
L’action NIV-TRACE permet de déterminer le niveau de trace de l’action EXE-REQUETE suivante. Il s’agit d’une valeur numérique de type entier qui peut prendre les valeurs suivantes :
0 => Pas de trace.
1 => Activation des traces pour déboguer.
L’activation des traces va générer deux fichiers supplémentaires dans le répertoire DIAP_TMP :
Le fichier « <RacineIdendifiantRequete>_DebugCmdCurl.sh va contenir une commande que vous allez pouvoir exécuter sur le serveur pour simuler la même demande mais avec un affichage du résultat à l’écran.
Le fichier « <RacineIdendifiantRequete>_DebugCmdCurl.txt va contenir la commande curl exacte qui va être utilisée dans le code interne de Diapason.
Voici un exemple d’utilisation de l’action NIV-TRACE :
COMMENTAIRE : "Exemple d'activation des traces"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= NIV-TRACE , VALEUR= CLO.1 )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO."Problème avec l'activation des traces" + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
OPTION
Les options sont des paramètres sous la forme CLE / Valeur qui vont permettre de modifier certains paramètres techniques de l’exécution de la requête http :
L’option CERTIFICAT va permettre de spécifier le chemin complet du certificat que l’on souhaite utiliser pour la requête
L’option FICHIERS-TMP va permettre de spécifier le répertoire de travail pour une requête donnée.
Voici un exemple d’utilisation d’une option :
COMMENTAIRE : "Exemple de modification du répertoire de travail"
VLO.RetourFonction = SW-REQUETE-HTTP( ACTION= OPTION , CLE-OPTION= CLO."FICHIERS-TMP" , VAL-OPTION= CLO."/tmp/" )
SI VLO.RetourFonction EXISTE ET <> ""
LC-Erreur = CLO." Problème avec l'utilisation de l'option FICHIERS-TMP " + " " + CLO.":" + VLO.RetourFonction
FIN_BLOC
Outils de manipulation des données au format JSON
Les outils de manipulation de données au format json sont principalement basés sur la liste DIALOG WFSWListeJSON qui représentera une structure JSON. La fonction SW-OUTILS-JSON a pour but d’effectuer des opérations sur cette liste pour faciliter la création et l’extraction d’informations.
Les principes du format JSON
JSON (JavaScript Object Notation) est un format léger d'échange de données. Il est facile à lire ou à écrire pour des humains. C’est un format texte complètement indépendant de tout langage.
JSON se base deux structures : les objets et les tableaux (ou liste). Il y a une imbrication forte entre ces deux structures car chaque valeur (value) peut aussi bien être un type simple qu’un objet ou un tableau.
Voici un exemple de JSON :
{
"nom cours": "NF29",
"theme": "ingenierie documentaire",
"etudiants": [
{
"nom": "Norris",
"prenom": "Chuck",
"age": "73",
"pays": "USA",
"adresse": {
"code postal": 65000,
"ville": "Tarbes",
"rue": "18 Bd Jean Moulin"
},
"notes": [
19.5,
15,
13,
16.75
]
},
{
"nom": "Doe",
"prenom": "Jane",
"age": "45",
"pays": "Angleterre",
"adresse": {
"code Postal": 65290,
"ville": "Juillan",
"rue": "Téléport Bâtiment, 8 Pyrène Aéro Pôle"
},
"notes": [
9.5,
12,
13.5
]
},
{
"nom": "Ourson",
"prenom": "Winnie",
"age": "10",
"pays": "France",
"adresse": {},
"notes": []
}
]
}
Objet JSON
Un objet, qui est un ensemble de couples nom/valeur non ordonnés. Un objet commence par « { » et se termine « } ». Chaque nom est suivi de « : » et les couples nom/valeur sont séparés par « , ».
![](../__attachments/115229542/att_4_for_229507840.png?inst-v=2e0628d9-a170-4eb1-b774-b0d7a84fa1a1)
Tableau JSON (array)
Un tableau est une collection de valeurs ordonnées. Un tableau commence par « [ » et se termine par « ] ». Les valeurs sont séparées par « , ».
![](../__attachments/115229542/att_3_for_229507840.png?inst-v=2e0628d9-a170-4eb1-b774-b0d7a84fa1a1)
Une Valeur (value)
Une valeur peut être soit une chaîne de caractères entre guillemets, soit un nombre, soit true ou false ou null, soit un objet soit un tableau. Ces structures peuvent être imbriquées.
![](../__attachments/115229542/att_5_for_229507840.png?inst-v=2e0628d9-a170-4eb1-b774-b0d7a84fa1a1)
Élément racine
Il ne peut y avoir qu’un élément racine :
De type tableau : commençant par « [ » et se terminant par « ] » ou de type objet : commençant par « { » et se terminant par « } »
La liste de représentation
La liste de représentation JSON a pour but de décrire dans une liste toutes les informations d’une structure JSON pour pouvoir transformer un JSON => Liste ou une Liste => JSON sans perte d’information. Un ensemble d’informations additionnelles « redondantes » a été ajouté pour faciliter au maximum l’extraction d’une information en un minimum de parcours/recherche.
Description de la liste
Voici la description de la liste WFSWListeJSON:
NumOrdElement | Numéro d'ordre des éléments |
CleLstRefAscendants | Liste chainée des références des ascendants |
CleRefElement | Référence de l'élément |
TypeElement | Type de l'élément (OBJET,TABLEAU,CARACTERE,NUMERIQUE,LOGIQUE,LONGCHAR) |
ValeurCarElement | Valeur caractère de l'élément |
ValeurNumElement | Valeur décimale de l'élément |
ValeurLogElement | Valeur logique de l'élément |
Cal_NivElement | Champ calculé : Niveau de l'élément |
Cal_PathElement | Champ calculé : Chemin complet de l'élément |
Cal_RefPere | Champ calculé : Référence du père de l'élément |
Cal_TypePere | Champ calculé : Type du père de l'élément |
Cal_PathPere | Champ calculé : Chemin complet du père de l'élément |
Cal_RefGrandPere | Champ calculé : Référence du grand-père de l'élément |
Cal_TypeGrandPere | Champ calculé : Type du grand-père de l'élément |
Cal_PathGrandPere | Champ calculé : Chemin complet du grand-père de l'élément |
Cal_RefArGrandPere | Champ calculé : Référence de l'arrière-grand-père de l'élément |
Cal_TypeArGrandPere | Champ calculé : Type de l'arrière-grand-père de l'élément |
Cal_PathArGrandPere | Champ calculé : Chemin complet de l'arrière-grand-père de l'élément |
Les valeurs calculées
Les champs de la liste commençant par « Cal_ » sont des informations redondantes inutiles pour générer un JSON à partir de la liste. Elles ont pour objectif de faciliter les parcours d’extraction d’informations en DIALOG.
Ces informations sont alimentées par les actions de conversion de fichiers JSON en Liste ou de contenu JSON d’une requête http vers une liste. Dans les autres cas, ces champs sont vides et ils n’ont pas à être renseignés en création.
Structure arborescente et références d’éléments
Un élément sera identifié de façon unique avec les deux informations suivantes :
la liste chainée de toutes les références d’éléments ascendants jusqu’à la racine ;
la référence de l’élément courant.
Les références d’éléments sont uniques seulement sur un même parent.
Pour tous les éléments JSON du type CLE / VALEUR, la référence sera naturellement la valeur de la CLE.
Les éléments d’un tableau JSON n’ayant pas de référence, une référence du type « TAB<INDICE> » sera automatiquement générée par les fonctions de création d’éléments ou d’importation de JSON dans une liste.
Les valeurs de grande capacité (valeur fichier)
Dans un fichier JSON , la « valeur » d’un élément du type CLE / VALEUR peut être trop grande pour être stockée dans une variable. Il est par exemple possible de stocker le contenu d’un PDF (encodé en base 64) dans la valeur d’un élément.
Dans ce cas, aucun des champs « Valeur* » de la liste ne peut contenir la valeur. Pour les champs de ce type, il faudra utiliser les actions de la fonction DIALOG permettant d’écrire la valeur d’un élément dans un fichier.
Une autre action permet aussi d’alimenter une valeur de grande capacité à partir d’un fichier.
Exemple de transformation JSON➡️ Liste
Ce chapitre présente un exemple de JSON avec la liste WFSWListeJSON correspondante.
Voici le JSON :
{
"nom cours": "NF29",
"theme": "ingenieriedocumentaire",
"etudiants":[
{
"nom": "Norris",
"prenom": "Chuck",
"age": "73",
"pays": "USA",
"adresse":{
"code postal":65000,
"ville": "Tarbes",
"rue": "18 Bd Jean Moulin"
},
"notes":[
19.5,
15,
13,
16.75
]
},
{
"nom": "Doe",
"prenom": "Jane",
"age": "45",
"pays": "Angleterre",
"adresse":{
"code Postal":65290,
"ville": "Juillan",
"rue": "Téléport Bâtiment, 8 PyrèneAéroPôle"
},
"notes":[
9.5,
12,
13.5
]
},
{
"nom": "Ourson",
"prenom": "Winnie",
"age": "10",
"pays": "France",
"adresse":{},
"notes":[]
}
]
}
Voici la liste WFSWListeJSON sans les valeurs calculées:
NumOrdElement | CleLstRefAscendants | CleRefElement | TypeElement | ValeurCarElement | ValeurNumElement |
1 | $RACINE$ | OBJET | 0 | ||
2 | $RACINE$ | nom cours | CARACTERE | NF29 | 0 |
3 | $RACINE$ | theme | CARACTERE | Ingenierie documentaire | 0 |
4 | $RACINE$ | etudiants | TABLEAU | 0 | |
5 | $RACINE$‡etudiants | TAB_00001 | OBJET | 0 | |
6 | $RACINE$‡etudiants‡TAB_00001 | nom | CARACTERE | Norris | 0 |
7 | $RACINE$‡etudiants‡TAB_00001 | prenom | CARACTERE | Chuck | 0 |
8 | $RACINE$‡etudiants‡TAB_00001 | age | CARACTERE | 73 | 0 |
9 | $RACINE$‡etudiants‡TAB_00001 | pays | CARACTERE | USA | 0 |
10 | $RACINE$‡etudiants‡TAB_00001 | adresse | OBJET | 0 | |
11 | $RACINE$‡etudiants‡TAB_00001‡adresse | Code Postal | NUMERIQUE | 65000 | 65000 |
12 | $RACINE$‡etudiants‡TAB_00001‡adresse | Ville | CARACTERE | Tarbes | 0 |
13 | $RACINE$‡etudiants‡TAB_00001‡adresse | Rue | CARACTERE | 18 Bd Jean Moulin | 0 |
14 | $RACINE$‡etudiants‡TAB_00001 | notes | TABLEAU | 0 | |
15 | $RACINE$‡etudiants‡TAB_00001‡notes | TAB_00001 | NUMERIQUE | 19,5 | 19,5 |
16 | $RACINE$‡etudiants‡TAB_00001‡notes | TAB_00002 | NUMERIQUE | 15 | 15 |
17 | $RACINE$‡etudiants‡TAB_00001‡notes | TAB_00003 | NUMERIQUE | 13 | 13 |
18 | $RACINE$‡etudiants‡TAB_00001‡notes | TAB_00004 | NUMERIQUE | 16,75 | 16,75 |
19 | $RACINE$‡etudiants | TAB_00002 | OBJET | 0 | |
20 | $RACINE$‡etudiants‡TAB_00002 | nom | CARACTERE | Doe | 0 |
21 | $RACINE$‡etudiants‡TAB_00002 | prenom | CARACTERE | Jane | 0 |
22 | $RACINE$‡etudiants‡TAB_00002 | age | CARACTERE | 45 | 0 |
23 | $RACINE$‡etudiants‡TAB_00002 | pays | CARACTERE | Angleterre | 0 |
24 | $RACINE$‡etudiants‡TAB_00002 | adresse | OBJET | 0 | |
25 | $RACINE$‡etudiants‡TAB_00002‡adresse | Code Postal | NUMERIQUE | 65290 | 65290 |
26 | $RACINE$‡etudiants‡TAB_00002‡adresse | Ville | CARACTERE | Juillan | 0 |
27 | $RACINE$‡etudiants‡TAB_00002‡adresse | Rue | CARACTERE | Téléport Bâtiment, 8 Pyrène AéroPôle | 0 |
28 | $RACINE$‡etudiants‡TAB_00002 | notes | TABLEAU | 0 | |
29 | $RACINE$‡etudiants‡TAB_00002‡notes | TAB_00001 | NUMERIQUE | 9,5 | 9,5 |
30 | $RACINE$‡etudiants‡TAB_00002‡notes | TAB_00002 | NUMERIQUE | 12 | 12 |
31 | $RACINE$‡etudiants‡TAB_00002‡notes | TAB_00003 | NUMERIQUE | 13,5 | 13,5 |
32 | $RACINE$‡etudiants | TAB_00003 | OBJET | 0 | |
33 | $RACINE$‡etudiants‡TAB_00003 | nom | CARACTERE | Ourson | 0 |
34 | $RACINE$‡etudiants‡TAB_00003 | prenom | CARACTERE | Winnie | 0 |
35 | $RACINE$‡etudiants‡TAB_00003 | age | CARACTERE | 10 | 0 |
36 | $RACINE$‡etudiants‡TAB_00003 | pays | CARACTERE | France | 0 |
37 | $RACINE$‡etudiants‡TAB_00003 | adresse | OBJET | 0 | |
38 | $RACINE$‡etudiants‡TAB_00003 | notes | TABLEAU | 0 |
Les champs calculés ne sont pas présentés ici mais ils correspondent aux références et aux chemins des éléments père, grand-père et arrière-grand-père.
Création d’un JSON
La création d’une structure JSON dans la liste WFSWListeJSON devra passer par l’utilisation de la fonction DIALOG SW-OUTILS-JSON. L’utilisation de cette fonction permet de générer automatiquement les références des éléments de tableau et d’alimenter.
Les actions d’ajout de la fonction DIALOGSW-OUTILS-JSON
AJOUT-VAL-OBJET
Cette action permet d’ajouter un couple nom/Valeur avec une valeur de type « Objet ».
Le deuxième paramètre est le chemin complet de l’élément (chemin des ascendants + séparateur + référence du nouvel élément).
Voici un exemple de l’action AJOUT-VAL-OBJET :
COMMENTAIRE : "Ajout d’une valeur de type objet ‘{‘ "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."CLE_EXEMPLE_OBJET"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-OBJET , CHEMIN-PERE= VLO.CheminElement )
AJOUT-VAL-TABLEAU
Cette action permet d’ajouter un couple nom/Valeur avec une valeur de type « Tableau ».
Le deuxième paramètre est le chemin complet de l’élément (chemin des ascendants + séparateur + référence du nouvel élément).
Voici un exemple de l’action AJOUT-VAL-TABLEAU :
COMMENTAIRE : "Ajout d’une valeur de type tableau ‘[‘ "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."CLE_EXEMPLE_TABLEAU"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-OBJET , CHEMIN-PERE= VLO.CheminElement )
AJOUT-VAL-CAR
Cette action permet d’ajouter un couple nom/Valeur avec une valeur au format caractère.
Le deuxième paramètre est le chemin complet de l’élément (chemin des ascendants + séparateur + référence du nouvel élément).
Le dernier est la valeur de l’élément à ajouter.
Voici un exemple de l’action AJOUT-VAL-CAR :
COMMENTAIRE : " Ajout de ‘CLE_EXEMPLE’: ‘VALEUR_EXEMPLE’, "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."CLE_EXEMPLE"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."VALEUR_EXEMPLE" )
AJOUT-VAL-NUM
Cette action permet d’ajouter un couple nom/Valeur avec une valeur au format numérique.
Le deuxième paramètre est le chemin complet de l’élément (chemin des ascendants + séparateur + référence du nouvel élément).
Voici un exemple de l’action AJOUT-VAL-NUM :
COMMENTAIRE : " Ajout de ‘CLE_EXEMPLE_NUM’: 1024 , "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."CLE_EXEMPLE_NUM"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-NUM , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO.1024 )
AJOUT-VAL-LOG
Cette action permet d’ajouter un couple nom/Valeur avec une valeur au format logique.
Le deuxième paramètre est le chemin complet de l’élément (chemin des ascendants + séparateur + référence du nouvel élément).
Voici un exemple de l’action AJOUT-VAL-LOG :
COMMENTAIRE : " Ajout de ‘CLE_EXEMPLE_LOG’: false , "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."CLE_EXEMPLE_LOG"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-LOG , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CGL.NON )
AJOUT-VAL-CONT-FIC
Cette action permet d’ajouter un couple nom/Valeur avec une valeur de grande capacité. Cette valeur devra être stockée dans un fichier pour permettre à l’action AJOUT-CONT-FIC d’alimenter la valeur de l’élément JSON avec le contenu du fichier. Pour éviter les éventuels problèmes d’intégrité du JSON, cette valeur sera encodée en bas64 dans le JSON destination.
Le deuxième paramètre est le chemin complet de l’élément (chemin des ascendants + séparateur + référence du nouvel élément).
Le troisième est le PATH du fichier à ajouter.
Voici un exemple de l’action AJOUT-CONT-FIC :
COMMENTAIRE : " Ajout de ‘CLE_EXEMPLE_JPG’: ‘LzlqLzRBQVFTa1p …. LzlqLzRBQVFTa1p’, "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."CLE_EXEMPLE_JPG"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CONT-FIC, CHEMIN-ELEMENT= VLO.CheminElement , PATH-FIC = CLO."/tmp/Exemple.jpg" OPTION = CLO."")
AJOUT-ELEMENT-OBJET
Cette action permet d’ajouter un élément de type « Objet » à la fin d’un tableau. Elle permet donc de faire un tableau d’objets.
Le deuxième paramètre est le chemin du tableau dans lequel on souhaite ajouter l’élément.
Le dernier paramètre reçoit la valeur de la référence qui a été créée.
Voici un exemple de l’action AJOUT-ELEMENT-OBJET:
COMMENTAIRE : " Ajout d’un élément ‘{‘ à la fin d’un tableau "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-OBJET , CHEMIN-TABLEAU= VLO.CheminPere , S:REF-ELEMENT-CREE= VLO.NewRefElement )
AJOUT-ELEMENT-TABLEAU
Cette action permet d’ajouter un élément de type « Tableau » à la fin d’un tableau. Elle permet donc de faire un tableau de tableaux.
Le deuxième paramètre est le chemin du tableau dans lequel on souhaite ajouter l’élément.
Le dernier paramètre reçoit la valeur de la référence qui a été créée.
Voici un exemple de l’action AJOUT-ELEMENT-TABLEAU:
COMMENTAIRE : " Ajout d’un élément ‘[‘ à la fin d’un tableau "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-TABLEAU , CHEMIN-TABLEAU= VLO.CheminPere , S:REF-ELEMENT-CREE= VLO.NewRefElement )
AJOUT-ELEMENT-CAR
Cette action permet d’ajouter un élément de type caractère à la fin d’un tableau. Elle permet donc de faire un tableau de valeurs caractères.
Le deuxième paramètre est le chemin du tableau dans lequel on souhaite ajouter l’élément.
Le troisième est la valeur à ajouter dans le tableau.
Le dernier paramètre reçoit la valeur de la référence qui a été créée.
Voici un exemple de l’action AJOUT-ELEMENT-CAR:
COMMENTAIRE : " Ajout d’un élément de type CAR à la fin d’un tableau "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-TABLEAU , CHEMIN-TABLEAU= VLO.CheminPere, VALEUR-CAR-TAB = CLO."VALEUR_EXEMPLE", S:REF-ELEMENT-CREE= VLO.NewRefElement )
AJOUT-ELEMENT-NUM
Cette action permet d’ajouter un élément de type numérique à la fin d’un tableau. Elle permet donc de faire un tableau de valeurs numériques.
Le deuxième paramètre est le chemin du tableau dans lequel on souhaite ajouter l’élément.
Le troisième est la valeur à ajouter dans le tableau.
Le dernier paramètre reçoit la valeur de la référence qui a été créée.
Voici un exemple de l’action AJOUT-ELEMENT-NUM:
COMMENTAIRE : " Ajout d’un élément de type NUM à la fin d’un tableau "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-TABLEAU , CHEMIN-TABLEAU= VLO.CheminPere, VALEUR-NUM-TAB = CLO1024 , S:REF-ELEMENT-CREE= VLO.NewRefElement )
AJOUT-ELEMENT-LOG
Cette action permet d’ajouter un élément de type logique à la fin d’un tableau. Elle permet donc de faire un tableau de valeurs logiques.
Le deuxième paramètre est le chemin du tableau dans lequel on souhaite ajouter l’élément.
Le troisième est la valeur à ajouter dans le tableau.
Le dernier paramètre reçoit la valeur de la référence qui a été créée.
Voici un exemple de l’action AJOUT-ELEMENT-LOG:
COMMENTAIRE : " Ajout d’un élément de type LOG à la fin d’un tableau "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-TABLEAU , CHEMIN-TABLEAU= VLO.CheminPere, VALEUR-LOG-TAB = CGL.OUI , S:REF-ELEMENT-CREE= VLO.NewRefElement )
AJOUT-ELEMENT-CONT-FIC
Cette action permet d’ajouter un élément de grande capacité à la fin d’un tableau. Cette valeur devra être stockée dans un fichier pour permettre à l’action AJOUT-ELEMENT-CONT-FIC d’alimenter la valeur de l’élément JSON avec le contenu du fichier. Pour éviter les éventuels problèmes d’intégrité du JSON, cette valeur sera encodée en base 64 dans le JSON destination.
Voici un exemple de l’action AJOUT-ELEMENT-FIC:
COMMENTAIRE : " Ajout d’un élément de type grande capacité à la fin d’un tableau "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-CONT-FIC , CHEMIN-TABLEAU= VLO.CheminPere, PATH-FIC = CLO."/tmp/Exemple.jpg" , S:REF-ELEMENT-CREE= VLO.NewRefElement )
Les actions d’importation ou d’exportation de fichier
Ces actions ont pour but d’alimenter la liste WFSWListeJSON à partir d’un fichier JSON ou de générer un fichier JSON à partir de la liste WFSWListeJSON.
IMPORTER-FICHIER
Cette action a pour but d’alimenter la liste WFSWListeJSON à partir d’un fichier JSON.
Voici un exemple de l’action IMPORTER-FICHIER :
COMMENTAIRE : "Alimentation de la liste WFSWListeJSON à partir d'un fichier 'Modèle'."
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= IMPORTER-FICHIER , PATH-FIC= CLO."/tmp/FichierModele.json" , OPTION= CLO."" )
EXPORTER-FICHIER
Ces actions ont pour but de générer un fichier JSON à partir des informations la liste WFSWListeJSON.
Voici un exemple de l’action EXPORTER-FICHIER :
COMMENTAIRE : " Enregistrement dans un fichier JSON "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= EXPORTER-FICHIER , PATH-FIC= CLO."/tmp/ResFicJson.json" , OPTION= CLO."" )
Autres Fonctions DIALOG
SW-OUTILS-JSON-SEP
Cette fonction DIALOG permet de récupérer dans une variable le caractère de séparation entre les références pour les listes chainées des références des ascendants ou le chemin complet d’un élément.
Exemple d’utilisation :
COMMENTAIRE : "Récupération du séparateur des chemins des éléments "
VLO.SepElmnt = SW-OUTILS-JSON-SEP( )
SW-OUTILS-JSON-RACINE
Cette fonction DIALOG permet de récupérer la référence de la racine (le père du premier élément) d’une structure JSON.
Exemple d’utilisation :
COMMENTAIRE : "Récupération de la référence de la racine "
VLO.refRacine = SW-OUTILS-JSON-RACINE( )
Exemple complet de création d’un JSON
Voici un exemple de fichier JSON avec sa fonction DIALOG de génération.
➡️ Exemple de fichier JSON :
{
"DIAP_METHODE": "ISSWDG_SOR",
"DIAP_DATA": {
"FicTestImg.jpg": "LzlqLzRBQVFTa1pKUmdBQkFRRUFZQUJnQUFELzJ3QkRBRkEzUEVZOE1sQkdRVVphVlZCZm
..... Contenu tronqué .....
VBWi9uU2YzMi9PZ0JVbGtMcmwyNmp2UUJxVUFmL1o=",
"Voitures": [
{
"immatriculation": "0633BG64",
"modele": "Golf4",
"couleur": "rouge",
"nbKm": 1024.0,
"Dispo":true
},
{
"immatriculation": "457HJ65",
"modele": "CLIO2",
"couleur": "vert",
"nbKm": 164230.0,
"Dispo": false
}
]
}
}
➡️ Fonction DIALOG de génération
EFFACER Liste WFSWListeJSON
COMMENTAIRE : "Récupération du séparateur des chemins des éléments "
VLO.SepElmnt = SW-OUTILS-JSON-SEP( )
COMMENTAIRE : "Récupération de la référence de la racine "
VLO.refRacine = SW-OUTILS-JSON-RACINE( )
COMMENTAIRE : "Ajout du premier objet racine ‘{‘ "
VLO.CheminPere = VLO.refRacine
VLO.CheminElement = VLO.CheminPere
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-OBJET , CHEMIN-PERE= VLO.CheminElement )
COMMENTAIRE : " Ajout de ‘DIAP_METHODE’: ‘ISSWDG_SOR’, "
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."DIAP_METHODE"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."ISSWDG_SOR" )
COMMENTAIRE : " Ajout de l’objet ‘DIAP_DATA’: {"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + CLO."DIAP_DATA"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-OBJET , CHEMIN-PERE= VLO.CheminElement )
COMMENTAIRE : "Ajout de ‘FicTestImg.jpg’: ‘LzlqLzRBQ…’ avec le contenu d’un fichier JPG "
VLO.CheminPere = VLO.CheminElement + VLO.SepElmnt + CLO."FicTestImg.jpg"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CONT-FIC , CHEMIN-ELEMENT= VLO.CheminPere , PATH-FIC= CLO."/tmp/FicTestImg.jpg" , OPTION= CLO."" )
COMMENTAIRE : " Ajout du tableau ‘Voitures’: [ "
VLO.CheminElement = VLO.CheminElement + VLO.SepElmnt + CLO."Voitures"
VLO.CheminPere = VLO.CheminElement
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-TABLEAU , CHEMIN-ELEMENT-TAB= VLO.CheminElement )
COMMENTAIRE : " Ajout du 1er élément du tableau ‘{‘ "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-OBJET , CHEMIN-TABLEAU= VLO.CheminPere , S:REF-ELEMENT-CREE= VLO.NewRefElement )
COMMENTAIRE : "Ajout de ‘immatriculation’: ‘0633BG64’,"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."immatriculation"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."0633BG64" )
COMMENTAIRE : "Ajout de 'modele': 'Golf4',"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."modele"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."Golf4" )
COMMENTAIRE : "Ajout de 'couleur': 'rouge',"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."couleur"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."rouge" )
COMMENTAIRE : "Ajout de 'nbKm': 1024.0,"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."nbKm"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-NUM , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-NUM= CLO.1024 )
COMMENTAIRE : "Ajout de 'Dispo': true"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."Dispo"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-LOG , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-LOG= CGL.OUI )
COMMENTAIRE : " Ajout du 2eme élément du tableau ‘{‘ "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-ELEMENT-OBJET , CHEMIN-TABLEAU= VLO.CheminPere , S:REF-ELEMENT-CREE= VLO.NewRefElement )
COMMENTAIRE : "Ajout de 'immatriculation': '457HJ65',"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."immatriculation"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."457HJ65" )
COMMENTAIRE : "Ajout de 'modele': 'CLIO2',"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."modele"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."CLIO2" )
COMMENTAIRE : "Ajout de 'couleur': 'vert'"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."couleur"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-CAR , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-CAR= CLO."vert" )
COMMENTAIRE : "Ajout de 'nbKm': 164230.0,"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."nbKm"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-NUM , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-NUM= CLO.164230 )
COMMENTAIRE : "Ajout de 'Dispo': false"
VLO.CheminElement = VLO.CheminPere + VLO.SepElmnt + VLO.NewRefElement + VLO.SepElmnt + CLO."Dispo"
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= AJOUT-VAL-LOG , CHEMIN-ELEMENT= VLO.CheminElement , VALEUR-LOG= CGL.NON )
COMMENTAIRE : " Enregistrement dans un fichier JSON "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= EXPORTER-FICHIER , PATH-FIC= CLO."/tmp/ResFicJson.json" , OPTION= CLO."" )
Lecture et extraction des informations d’un JSON
La lecture et l’extraction d’informations se feront « classiquement » avec des parcours et des recherches sur la liste DIALOG WFSWListeJSON. Il conviendra d’utiliser les informations suivantes pour optimiser l’extraction d’informations :
Niveau de l'élément
Chemin complet de l'élément ou de l’un de ses ascendants
Référence de l'élément ou de l’un de ses ascendants
Type de l'élément ou de l’un de ses ascendants.
Une fois l’élément obtenu, il faudra récupérer la valeur dans le champ correspondant à son type :
TypeElement | Type de l'élément (CARACTERE,NUMERIQUE,LOGIQUE,LONGCHAR) |
ValeurCarElement | Valeur caractère de l'élément |
ValeurNumElement | Valeur décimale de l'élément |
ValeurLogElement | Valeur logique de l'élément |
Remarque : Les valeurs des éléments de grande capacité (TypeElement= « LONGCHAR ») pourront être récupérées avec l’action RECUP-CONT-FIC de la fonction DIALOG SW-OUTILS-JSON (voir chapitre ci-dessous)
Exemple de lecture d’un JSON
Voici un exemple d’extraction d’informations dans le fichier JSON ci-dessous :
{
"DIAP_METHODE": "ISSWDG_SOR",
"DIAP_DATA": {
"FicTestImg.jpg": "LzlqLzRBQVFTa1pKUmdBQkFRRUFZQUJnQUFELzJ3QkRBRkEzUEVZOE1sQkdRVVphVlZCZm
..... Contenu tronqué .....
VBWi9uU2YzMi9PZ0JVbGtMcmwyNmp2UUJxVUFmL1o=",
"Voitures": [
{
"immatriculation": "0633BG64",
"modele": "Golf4",
"couleur": "rouge",
"nbKm": 1024.0,
"Dispo":true
},
{
"immatriculation": "457HJ65",
"modele": "CLIO2",
"couleur": "vert",
"nbKm": 164230.0,
"Dispo": false
}
]
}
}
COMMENTAIRE : "Récupération du séparateur des chemins des éléments"
VLO.SepElmnt = SW-OUTILS-JSON-SEP( )
COMMENTAIRE : "Récupération du chemin absolu du tableau 'voitures'"
RECH PREM LST WFSWListeJSON AVEC WFSWListeJSON.CleRefElement = CLO."Voitures" :
VLO.CheminTableauVoiture = WFSWListeJSON.CleLstRefAscendants + VLO.SepElmnt + WFSWListeJSON.CleRefElement
FIN_BLOC
COMMENTAIRE : "Alimentation d'une liste avec les informations 'modele' 'couleur' et 'Dispo' de chaque voiture."
VLO.LigneTrace = CLO.""
POUR CHAQUE LST WFSWListeJSON AVEC WFSWListeJSON.Cal_PathPere = VLO.CheminTableauVoiture :
VLO.CheminElementTableau = WFSWListeJSON.CleLstRefAscendants + VLO.SepElmnt + WFSWListeJSON.CleRefElement
COMMENTAIRE : "Parcours de toutes les propriétés d'une voiture"
POUR CHAQUE LST WFSWListeJSON AVEC WFSWListeJSON.Cal_PathPere = VLO.CheminElementTableau PAR NumOrdElement CROISSANT :
SI WFSWListeJSON.CleRefElement = CLO."modele"
VLO.LigneTrace = VLO.LigneTrace + " " + WFSWListeJSON.ValeurCarElement
FIN_BLOC
SI WFSWListeJSON.CleRefElement = CLO."couleur"
VLO.LigneTrace = VLO.LigneTrace + " " + WFSWListeJSON.ValeurCarElement
FIN_BLOC
SI WFSWListeJSON.CleRefElement = CLO."Dispo"
VLO.LigneTrace = VLO.LigneTrace + " " + CHAINE( VALEUR= WFSWListeJSON.ValeurLogElement )
CREATION Liste LST.ListeTrace :
PRENDRE ListeTrace LigneTrace = VLO.LigneTrace
FIN_BLOC
VLO.LigneTrace = CLO.""
FIN_BLOC
FIN_BLOC
FIN_BLOC
Élément de grande capacité
Pour pouvoir exploiter les valeurs de grande capacité dans les JSON, l’action RECUP-CONT-FIC permet d’enregistrer un contenu dans un fichier.
RECUP-CONT-FIC
Cette action permet d’enregistrer dans un fichier le contenu de grande capacité d’un élément de la liste WFSWListeJSON (si TypeElement= « LONGCHAR »).
Voici un exemple d’utilisation :
COMMENTAIRE : " Exemple de récupération d’un pdf contenu dans un élément JSON "
VLO.RetourFonction = SW-OUTILS-JSON( ACTION= RECUP-CONT-FIC , CHEMIN-TABLEAU= VLO.CheminPere, PATH-FIC = CLO."/tmp/Exemple.pdf" , OPTION = CLO."" )