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