Décoder le JSON

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/import-json-to-excel-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

334jsonstring.xlsm (22.64 Ko)

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

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 ...

Bonjour,

Désolé, ne connaissant absolument pas JS, je ne peux pas plus t'aider !

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

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

432jsonversexcel.xlsm (34.81 Ko)

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.

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
Rechercher des sujets similaires à "decoder json"