28 avril 2015
publié par 
L'utilisation de données au format JSON (JavaScript Object Notation – Notation Objet issue de JavaScript) avec un formatage déterminé à l'avance, est très simple en WLangage, grâce au principe de sérialisation. En effet les fonctions Désérialise et Sérialise permettent de transférer les données JSON dans des structures et/ou tableaux WLangage, qui permettent ensuite toutes les actions possibles.

Par contre lorsqu'une application, ou un site, doit exploiter des données JSON dont le format et les clés ne sont pas connus à l'avance, ou que le format va très probablement être changé, l'utilisation de structures alimentées par la fonction Désérialise n'est plus possible. Dans ce cas, il faut parcourir l'ensemble de la structure afin d'obtenir les différentes clés et leurs valeurs, ainsi que l'arborescence. Pour ce besoin le WLangage propose également une fonction qui fait l'essentiel du travail : JSONVersVariant. Combinée avec la propriété ..Membre, la fonction JSONVersVariant permet en effet un parcours simple d'un JSON d'une structure quelconque, via le type variant.

Voici un exemple de parcours générique, il peut être testé par un copier/coller dans le code d'un bouton par exemple. Il montre comment effectuer le parcours en faisant une "Trace" des clés et valeurs du JSON. Dans la pratique la trace peut être remplacée par tout type d'action en fonction des besoins :
  • chargement d'un tableau associatif en utilisant les clés du JSON comme indices pour le tableau
  • écriture des données dans une base ...

sJSon est une chaîne = [
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}]}}}
] // exemple de http://json.org/example

vJSON est un Variant = JSONVersVariant(sJSon)


ParcoursMembresVariant(vJSON)


PROCEDURE INTERNE ParcoursMembresVariant(_ObjetOuTableau)

SELON _ObjetOuTableau..Type

CAS wlVariantObjet :

POUR TOUT _Membre de _ObjetOuTableau..Membre

SI _Membre..Membre..Occurrence = 0 ALORS

SELON _Membre..Type
CAS wlVariantTableau :
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
"Le membre " + _Membre..Nom +...
" contient un tableau...")
ParcoursMembresVariant(_Membre)
AUTRES CAS :
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
"Le membre " + _Membre..Nom + " a la valeur " +...
_Membre..Valeur)
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

CAS wlVariantTableau :
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
"Tableau de "+_ObjetOuTableau..Occurrence+" éléments...")

POUR TOUT ELEMENT UnElement, Compteur de _ObjetOuTableau
Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
"Exploration de l'élément "+Compteur+"/"+_ObjetOuTableau..Occurrence)
ParcoursMembresVariant(UnElement)
FIN

AUTRES CAS : Trace("A gérer ("+_ObjetOuTableau..Type+") !?"+_ObjetOuTableau)
FIN
FIN



A noter que le code utilise une procédure interne. Elles sont très pratique lorsqu'un code à besoin d'une procédure qui lui est dédiée (récursivité comme ici, et les fonctions WLangage utilisant une "callback"). Elles évitent la création d'une procédure locale à la fenêtre. De plus lorsque le code est copié/collé, la procédure interne l'est également.

< Retour

6 commentaires

Zartan
20/08/2017 - 19:15 - Répondre
Bonjour, J'essaye de récupérer des horaires SNCF sur leur API avec ton code. L'appel est https://b14d6a81-02f8-4fa2-bc10-ce1a4ccf81e5@api.sncf.com/v1/coverage/sncf/lines/line%3AOCE%3A610/vehicle_journeys?from_datetime=20170820T000000&data_freshness=realtime&count=1000& Achtung : penser à positionner la date à date du jour. Je me retrouve avec un _ObjetOuTableau..Type = 28 (non listé dans la doc) donc échec de ma proc Un petit coup de main? Merci de ton aide !

N'GUESSAN
30/10/2018 - 00:51 - Répondre
C'EST superper Merci beaucoup pour ce blog

Jose Dubois
24/02/2021 - 12:29 - Répondre
Très beau code et très utile, merci!

DANKO KONATE
24/03/2021 - 15:07 - Répondre
Bonjour, j'essaye de récupérer le contenu d'un fichier JSON dans un tableau avec le code ci-dessous mais au moment ou j'exécute le code il m'indique que JSON n'est pas un tableau Sablier(Vrai) maReqRest est une restRequête maReqRest.Utilisateur = "restfull" maReqRest.MotDePasse = "NeverGetHere@" maReqRest..URL = "https://ae.dgdifrance.fr/booking/index.php/api/v1/customers" maRepRest est une restRéponse = RESTEnvoie(maReqRest) //repVariant est un variant //si ErreurDétectée alors // erreur(ErreurInfo(errComplet)) //sinon // repVariant =JSONVersVariant(maRepRest.Contenu) // pour TOUT STCustomers de repVariant[3].results // TableAjouteLigne(TABLE_GtabTb_costumers,STCustomers.id,STCustomers.sFirst_name,STCustomers.sLast_name,STCustomers.sEmail,STCustomers.sMobile_number,STCustomers.sPhone_number,STCustomers.sAddress,STCustomers.sCity,STCustomers.sTate,STCustomers.sNotes,STCustomers.sZip_code) // FIN //FIN // SI maRepRest..Contenu <> "" ALORS Désérialise(gtabTb_costumers,maRepRest..Contenu,psdJSON) TableAffiche(TABLE_customers,taDébut) FIN //// //SI ErreurDétectée ALORS // Erreur(ErreurInfo(errComplet)) //SINON //Info(maRepRest.Contenu) //fin Sablier(Faux)

Guillaume BAYLE
24/03/2021 - 15:25 - Répondre
Bonjour, dans votre exemple vous pouvez récupérer le tableau immédiatement dans une variable : RéponseJSON est un JSON = maRepRest..Contenu. N'hésitez pas à contacter notre support si la moindre difficulté subsiste. Bons développements !

Herve
13/12/2021 - 08:58 - Répondre
Bonjour Pourquoi ai-je une erreur de compilation dans cette structure JSON, au niveau de "publisher" et "publishedDate" qui provient de Google Api ? https://www.googleapis.com/books/v1/volumes?q=isbn:9782747028370 Merci hervé { "kind": "books#volume", "id": "qkCfoAEACAAJ", "etag": "4RM+HrxniQ4", "selfLink": "https://www.googleapis.com/books/v1/volumes/qkCfoAEACAAJ", "volumeInfo": { "title": "À l'oreille d'Atlas", "authors": [ "Charlotte Bousquet" ], "publisher": "Rageot", "publishedDate": "2014", "description": "Adolescente, Penelope monte souvent au haras de la Balzane. A la suite d'un pari, elle herite d'Atlas, un petit barbe qui mord et qui rue. Commence un long apprentissage ou la jeune fille, conseillee par Val la monitrice, tente d'apprivoiser le cheval, de le familiariser avec sa voix et son odeur. De promenade en seance de longe, le barbe gris demontre qu'il apprecie sa presence... mais parfois une panique irraisonnee l'envahit. De quoi a-t-il souffert ? Ou de qui ? Aidee par son ami Neo, Penelope tente de retracer son histoire grace au Web...", "industryIdentifiers": [ { "type": "ISBN_10", "identifier": "2700239636" }, { "type": "ISBN_13", "identifier": "9782700239638" } ], "readingModes": { "text": False, "image": False }, "pageCount": 124, "printedPageCount": 124, "dimensions": { "height": "18.00 cm", "width": "12.50 cm", "thickness": "1.00 cm" }, "printType": "BOOK", "maturityRating": "NOT_MATURE", "allowAnonLogging": False, "contentVersion": "preview-1.0.0", "language": "fr", "previewLink": "http://books.google.com/books?id=qkCfoAEACAAJ&hl=&source=gbs_api", "infoLink": "https://play.google.com/store/books/details?id=qkCfoAEACAAJ&source=gbs_api", "canonicalVolumeLink": "https://play.google.com/store/books/details?id=qkCfoAEACAAJ" }, "saleInfo": { "country": "NC", "saleability": "NOT_FOR_SALE", "isEbook": False }, "accessInfo": { "country": "NC", "viewability": "NO_PAGES", "embeddable": False, "publicDomain": False, "textTo

Publier un commentaire : 
Votre adresse email ne sera pas publiée