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()"}]}}}
]
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 - En attente de modération 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 - En attente de modération C'EST superper Merci beaucoup pour ce blog |
|
| |
| | Jose Dubois 24/02/2021 - 12:29 - Répondre - En attente de modération Très beau code et très utile, merci! |
|
| |
| | DANKO KONATE 24/03/2021 - 15:07 - Répondre - En attente de modération 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 - En attente de modération 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 - En attente de modération 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 |
|
| |
| |
|
| |
|