Importer en json dans excel Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
c
calten
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 30 mai 2019
Version d'Excel : 2010 FR

Message par calten » 31 mai 2019, 12:58

Bonjour à tout le forum,

Merci Pierre pour votre réponse, y-a t'il un moyen d'avoir la même présentation que dans les exemples précédents à savoir on saisie la course dans une cellule Excel, puis la réunion dans une autre afin d'avoir à loisir chaque course que l'on souhaite comme pour les exemples précédents avec les données dans chaque colonne avec ce lien .https://offline.turfinfo.api.pmu.fr/rest/client/7/programme/31052019/R4/C1/participants?specialisation=OFFLINE... J'ai trouvé un json qui stocke toutes les informations qui me serait utile ensuite à la fin de la réunion.
https://offline.turfinfo.api.pmu.fr/rest/client/7/programme/31052019?meteo=true&specialisation=OFFLINE
Et celui-ci aussi
https://offline.turfinfo.api.pmu.fr/rest/client/7/programme/31052019/R4/C1/masse-enjeu-v2?specialisation=OFFLINE

C'est parce que même en essayant avec le code plus haut et en changeant les noms je n'ai rien qui s'affiche, je peux saisir le code en entier ce qu'il me faut c'est le point de départ, car pour chaque lien plus haut les données sont exploitables mais différemment. Merci encore pour votre aide.
Bonne journée à tous
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 934
Appréciations reçues : 125
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 31 mai 2019, 15:48

A l'évidence, quelques explications sont utiles. Changer quelques mots clé n'est pas suffisant.

Pour commencer il faut bien savoir ce qu'est le json. Pour cela, il y a des sites très bien qui en explique les fondamentaux.
Un exemple ici (mais il y en a plein d'autres) => https://la-cascade.io/json-pour-les-debutants/

Donc avec ces explications, il est clair qu'il y a autant de structures de fichiers json qu'il y a de json (ou presque). Chaque json (téléchargé ou lu directement sur internet) doit donc avoir un décodage qui lui est propre.

La plupart du temps un site donné pour un besoin donné met à disposition un json qui aura toujours la même structure. Si dans l'adresse, il y a la date ou une réf qui change, la structure restera la même. Mais pour des données différentes, il se peut que les structures soient différentes (c'est le cas de offline.turfinfo)

Ok, donc la base du json c'est un couple clé/valeur, par exemple : "code_dept": "56" ou bien "code_dept": 56 (texte dans le 1er cas, numérique dans le 2ème)
En sachant que la valeur peut être de plusieurs types : texte/numérique/Array ou "parent" d'une sous-structure.
Donc chaque mot-clé peut être sur un niveau précis d'un structure/sous-structure.
Pour connaitre la structure, les mots-clé et les niveaux il y a des outils pour ça. Je poste ici le mien : "Démo GetKey_Json.xlsm" mais il y en a d'autres (cf Steelson par exemple)

Donc maintenant que je connais la structure du json, comment on fait avec excel?

1/ Récupérer le json via internet :
Dans le fichier Turf_Calten.xlsm, il y a la fonction Rcdst_Jsn qui retourne le contenu dans un "Object" (fonction classique qu'on trouve un peu partout basé sur "MS.ScriptControl" et sur "MSXML2.XMLHTTP") qu'on peut réutiliser telle quelle.
Ici l'url du site peut provenir du contenu d'une cellule ou d'une concaténation de plusieurs cellues ou valeur (chacun fait comme il veut)

2/ Ensuite on "découpe" l'Object obtenu en fonction des mots clés :
* si c'est du texte ou du numérique c'est simplement du genre : Object.motclé
* si c'est une Array du type : "geo_point_2d": [
47.52204264643347,
2.577570172192727
], on récupère la 1ere info avec un : VBA.CallByName(Object.geo_point_2d, "0", VbGet),
la 2ème sera: VBA.CallByName(Object.geo_point_2d, "1", VbGet)
* si c'est une array avec mot-clé, on peut utiliser les mots-clé, par exemple : Object.typePari
* si c'est un parent d'une sous-structure, on place le bloc dans un sous-object et on redécoupe à un niveau inférieur.
* si c'est une array avec enregistrements multiples, on boucle sur chaque élément :
For Each Element in Object.motclé ...

A noter : parfois les mots clé utilisés sont des mots réservés du Vba exemple "name" => dans ce cas on récupère le contenu avec un VBA.CallByName(Object, "name", VbGet)

3/ une fois le contenu souhaité récupéré, il suffit de le coller sur la feuille. Sans oublier éventuellement d'incrémenter le n° le ligne à chaque nouvel enregistrement.


Donc dans le cas exposé : 3 nouveaux json / 3 structures différentes / 3 traitements différents à écrire.

Avec ces quelques notes et les exemples de code déjà donnés, ça devrait être possible par tout un chacun.

Bon codage
Pierre
c
calten
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 30 mai 2019
Version d'Excel : 2010 FR

Message par calten » 31 mai 2019, 16:12

Je suis très impressionné par la réponse et je vous remercie, 3 structures différentes donc 3 codes différents à écrire c'est ce que je pensais aussi, cela va être compliqué mais cela ne me rebute pas je suis d'un naturel patient j'ai cliqué sur "Démo GetKey_Json.xlsm" mais rien ne s'est produit.
Il y a des convertisseurs online de json vers Excel mais j'aimerais vraiment pouvoir le faire moi-même car la plupart ne donnent pas satisfaction.Lorsque j'aurais vraiment acquis le maniement des json ce sera plus facile pour moi.Dans l'immédiat je vais relire le sujet, merci beaucoup.
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 934
Appréciations reçues : 125
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 31 mai 2019, 16:17

Oups, j'avais oublié de le poster ...
Démo GetKey_Json.xlsm
(39.1 Kio) Téléchargé 23 fois
c
calten
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 30 mai 2019
Version d'Excel : 2010 FR

Message par calten » 31 mai 2019, 16:25

Merci beaucoup je vais testé le fichier.
Cordialement
c
calten
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 30 mai 2019
Version d'Excel : 2010 FR

Message par calten » 31 mai 2019, 16:35

Ce fichier est excellent, cela va beaucoup m'aider à isolé les structures et surtout bien comprendre les json, merci beaucoup.
c
calten
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 30 mai 2019
Version d'Excel : 2010 FR

Message par calten » 1 juin 2019, 19:35

Bonjour

J'ai donc récupéré grâce au fichier Démo GetKey_Jsonde pierrep56 la structure du lien json correspondant à cette url :
https://offline.turfinfo.api.pmu.fr/rest/client/7/programme/31052019?meteo=true&specialisation=OFFLINE
La structure se présente ainsi :
Image
Il y a donc des données numeric, parent,text,array, à quoi correspond les numéros dans la colonne juste après par exemple programme on lit 1 ?
Je pense donc que "programme" est la clé qui me permettra d'extraire les données vers Excel,

je bloque ici,
pierrep56 :
* si c'est un parent d'une sous-structure, on place le bloc dans un sous-object et on redécoupe à un niveau inférieur.

Je ne sais pas si la macro doit s'approcher de :
Sub Calten()
Dim DataSet As Object, Cita As Object, Elem As Object, lg As Integer

    With Sheets("Feuil1")
        Set DataSet = Rcdst_Jsn(.Range("A1").Value)
        Set Cita = VBA.CallByName(DataSet.listeCitations, "0", VbGet)
        .Range("A3").Value = Cita.typePari
        .Range("B3").Value = Cita.dateProgramme
        .Range("C3").Value = Cita.timezoneOffset
        .Range("D3").Value = Cita.numeroReunion
        .Range("E3").Value = Cita.numeroCourse
        lg = 6
        For Each Elem In Cita.participants
            .Range("A" & lg).Value = Elem.numPmu
            .Range("B" & lg).Value = Elem.nom
            .Range("C" & lg).Value = Elem.statut
            .Range("D" & lg).Value = VBA.CallByName(Elem.citations, "0", VbGet).enjeu
            .Range("E" & lg).Value = VBA.CallByName(Elem.citations, "0", VbGet).ratio
            lg = lg + 1
        Next Elem
    End With
    Set DataSet = Nothing
    Set Cita = Nothing
End Sub
Je pensais remplacer Cita par Programme mais cela ne fonctionne pas, je pense aussi que VBA.CallByName
va chercher dans DataSet.programme mais cela ne fonctionne pas non plus je dois surement mal faire.
Que veut dire lg ?

Merci pour votre aide,
Cordialement
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 934
Appréciations reçues : 125
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 2 juin 2019, 10:19

Ok, on a donc de gauche à droite :
* la clé
* le niveau (un élément de niveau n est inclus dans l'élément n-1)
* le type
* ensuite une "représentation" de la hiérarchie des clés

Ensuite pour les noms des variables, on peut utiliser n'importe quel nom (si différent des mot-clé du VBA). Autant utiliser des noms qui parle au codeur
Précédemment lg c'est le n° de ligne de la feuille excel, on peut l'appeler ligne si c'est plus explicite.

Pour chaque url, le "décodage" doit être adapté à la structure du contenu. Un simple remplacement de mot-clé ne suffit pas.
Pour l'url indiquée la première clé niv1 est "programme". On peut donc placer le contenu de "programme" dans une variable Prg par exemple.

Ce qui permet de lire la clé "dateProgrammeActif" avec un Prg.dateProgrammeActif

Le "parent" suivant est "reunions", il faut donc boucler sur les éléments contenus dedans :
For Each Elem In Prg.reunions
Ce qui permets de récupérer par exemple les noms ("libelleCourt") des hippodromes :
Elem.hippodrome.libelleCourt

Ensuite l'élément parent "courses" est inclus dans Prg.reunions, on boucle donc sur les éléments contenus dedans :
For Each Elem2 In Elem.courses

et ainsi de suite ...

Ici dans le code exemple le Debug.Print affiche le résultat dans la fenêtre exécution du VBA (Ctrl+G), il est simple de l'écrire dans des cellules d'une feuille quelconque (sans oublier d'incrémenter le n° le ligne au fur et à mesure des For Each), voir les exemples précédents.

Bon codage
Pierre
Sub Calten_2()
Dim DataSet As Object, Prg As Object, Elem As Object, Elem2 As Object, lg As Integer

    With Sheets("Feuil1")
        Set DataSet = Rcdst_Jsn(.Range("A1").Value)
        Set Prg = DataSet.programme
        Debug.Print Prg.dateProgrammeActif
        Debug.Print Prg.timezoneOffset
        'etc ...
        
        For Each Elem In Prg.reunions
            Debug.Print Elem.hippodrome.libelleCourt
            'etc ...
            
            For Each Elem2 In Elem.courses
                Debug.Print Elem2.libelle
                'etc ...
            
            Next Elem2
            'etc ...
            
        Next Elem
    End With
    Set DataSet = Nothing
    Set Prg = Nothing
End Sub
1 membre du forum aime ce message.
c
calten
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 30 mai 2019
Version d'Excel : 2010 FR

Message par calten » 2 juin 2019, 11:55

Bonjour,

Merci Pierrep56 pour votre aide et votre disponibilité, les choses deviennent plus claires grâce à vous. Merci également pour le code qui va m'aider à démarré mes premiers codes.
Bon dimanche
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 11'675
Appréciations reçues : 606
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 2 juin 2019, 13:09

Bravo Pierre, le pape du json ...

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message