Décoder le JSON Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'599
Appréciations reçues : 671
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 16 décembre 2017, 18:35

Bonjour,

quelqu'un a-t-il une méthode simple pour décoder le JSON ?
j'avais déjà travaillé sur le sujet mais tout ce qui existe est relativement complexe comme ceci http://excelerator.solutions/2017/08/16 ... using-vba/

je cherche quelque chose de très "opérationnel" et qui me mette les données dans les cases excel

exemple ci-joint du "texte" JSON
JSONstring.xlsm
(22.64 Kio) Téléchargé 59 fois

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

( ͡• ͜ʖ ͡• )
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'015
Appréciations reçues : 303
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 17 décembre 2017, 10:16

Bonjour,

Je ne connais pas la finalité de ton souhait mais tu pourrais déjà Spliter afin d'extraire les noms des différents sports, puis des catégories, tournois, etc...
Résultat en colonne A mais le Shape est la source donc, il doit être rempli :
Sub Test()

    Dim S As Shape
    Dim T1
    Dim T2
    Dim I As Long
    Dim J As Long
    Dim K As Long

    Set S = ActiveSheet.Shapes("TexteJSON")
    
    T1 = Split(S.TextFrame2.TextRange.Characters.Text, "{")
    
    For I = 0 To UBound(T)
    
        T2 = Split(T(I), "}")
        
        For J = 0 To UBound(T2)
        
            K = K + 1
            Cells(K, 1).Value = T2(J)
        
        Next J
        
    Next I

End Sub
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'599
Appréciations reçues : 671
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 18 décembre 2017, 02:24

Merci Theze, c'est cela, mais il faut aller plus loin.

Il y a principalement 3 types de ponctuation :
[] pour les Array
{} pour les Objects
: pour séparer le nom d'un item et sa valeur
les , étant des séparateurs sauf s'ils sont inclus dans des guillemets
sachant que le tout peut être imbriqué comme des poupées russes !

Il existe bien des méthodes pour décoder un JSON et en faire un objet, mais cela ne me donne pas une cartographie / mapping visible. Car a priori on ne connait pas les noms des items, ce qui est en objet ou en tableau ... et c'est cela que je voudrais avoir.
En javascript, la méthode est simple : Eval et c'est fait ... puis un tableau. Je ne voudrais quand même pas passer par cet intermédiaire ici.

Je pense que je vais plutôt parcourir séquentiellement le Json (qui est du texte) pour décoder les signes de ponctuation ci-dessus et effectuer une identation dans une feuille excel pour en sortir la cartographie.
Le split est moins intéressant ici à cause de l'imbrication des données et de la nomenclature qui en résulte, bien qu'elle soit intéressante pour dégrossir le sujet. Et c'est ce que j'ai commencé à faire en utilisant ton programme ...

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

( ͡• ͜ʖ ͡• )
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'015
Appréciations reçues : 303
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 18 décembre 2017, 07:37

Bonjour,

Désolé, ne connaissant absolument pas JS, je ne peux pas plus t'aider !
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 970
Appréciations reçues : 141
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 18 décembre 2017, 10:00

Bonjour,

A ma connaissance, il n'y a pas de méthode simple pour decoder le Json (il n'y a que du complexe quand on ne connait pas la structure à l'avance).
En revanche, pour un json dont la structure est fixe, il est assez simple de repérer les clefs et de les lire. Et c'est souvent le cas des Json du web.

Ci-après une procédure démo pour lire le début de ton Json.
Il suffit de l'appeler par un : Decode_Json (JSON) à la fin de ta "interro_web"

Ce que fait cette procédure :
* lecture de l'entête des "sportIds"
* ensuite pour chaque "sportIds", lecture de chaque clef (sportName, categories, ...)
* et à la fin affichage des résultats en Feuil1!A2 (il faut qu'une Feuil1 existe, et en A2 pour laisser la place pour écrire les entêtes qui vont bien en ligne 1)

Ici donc ce n'est que le début de ton Json, pour la suite, il faudrait continuer un décodage similaire pour les clefs : categories, tournaments, teasers, matches, bets, outcomes, odds, ... de la même façon que pour la clef "sports" lue ici
Ceci bien sûr en adaptant le code avec les sous-clefs (par exempe les sous clefs de "categories": categoryName, tournaments, mainMatchCount, liveMatchCount, tvMatchCount)
Sub Decode_Json(S As String)
Dim T1 As Variant, T2 As Variant
Dim ScriptControl As Object, Json As Object
Dim DataSet As Object, Elem As Object
Dim i As Integer
    
    Set ScriptControl = CreateObject("MSScriptControl.ScriptControl")
    ScriptControl.Language = "JScript"    
    Set Json = ScriptControl.Eval("(" & S & ")")

    Set DataSet = Json.sportIds
    T1 = Split(DataSet, ",")
    ReDim T2(UBound(T1), 4)
    
    Set Elem = Json.sports
    For i = 0 To UBound(T1)
        T2(i, 0) = VBA.CallByName(Elem, CStr(T1(i)), VbGet).sportName
        T2(i, 1) = VBA.CallByName(Elem, CStr(T1(i)), VbGet).categories
        T2(i, 2) = VBA.CallByName(Elem, CStr(T1(i)), VbGet).mainMatchCount
        T2(i, 3) = VBA.CallByName(Elem, CStr(T1(i)), VbGet).liveMatchCount
        T2(i, 4) = VBA.CallByName(Elem, CStr(T1(i)), VbGet).tvMatchCount
    Next i

    Sheets("Feuil1").Range("A2").Resize(UBound(T2, 1), UBound(T2, 2)) = T2

    Set Elem = Nothing
    Set DataSet = Nothing
    Set Json = Nothing
    Set ScriptControl = Nothing
End Sub
1 membre du forum aime ce message.
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'599
Appréciations reçues : 671
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 18 décembre 2017, 10:17

Merci Pierre pour ton input, je vais le reprendre sans doute dans le cas qui m'intéresse ...

Plus généralement, je me suis inspiré des travaux faits ici https://dymeng.com/parsing-json-with-vba/
et avec un aménagement sur la sortie et la fonction NZ, j'obtiens déjà ceci
JsonVersExcel.xlsm
(34.81 Kio) Téléchargé 61 fois
Il me reste à mettre en forme : tableau et TCD devrait nous donner un résultat intéressant

En parallèle, je vais voir comment adapter la proposition de Pierre dès lors qu'on connaîtra quelles données sont à récupérer.

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

( ͡• ͜ʖ ͡• )
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'599
Appréciations reçues : 671
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 19 décembre 2017, 02:14

pierrep56 a écrit :
18 décembre 2017, 10:00
Ici donc ce n'est que le début de ton Json, pour la suite, il faudrait continuer un décodage similaire pour les clefs : categories, tournaments, teasers, matches, bets, outcomes, odds, ... de la même façon que pour la clef "sports" lue ici
Ceci bien sûr en adaptant le code avec les sous-clefs (par exemple les sous clefs de "categories": categoryName, tournaments, mainMatchCount, liveMatchCount, tvMatchCount)
wahou, cela vaut largement un petit cœur, car maintenant que j'ai bien décodé les informations et leur suite "logique" (quoique tordue), je vais pouvoir m'appuyer sur ce superbe code !!
merci Pierre

je le passe en résolu avec ces 2 codes :
- le mien pour en avoir une cartographie complète
- le tien pour être capable d'aller cibler et récupérer les informations pertinentes

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