Utiliser un Web Service JSON – Episode 2
Lors de l’épisode précédent, nous avons lu les données brutes provenant d’un Web Service JSON.
Dans cette suite, nous allons configurer notre base de données pour qu’elle puisse transformer les données brutes en données VBA, plus faciles à manipuler dans l’environnement Access.
Télécharger la bibliothèque VB-JSON
Pour effectuer la transformation « JSON vers VBA », il nous faut un convertisseur. Plutôt que de réinventer la roue, autant utiliser un outil qui existe déjà : VB-JSON est la bibliothèque qu’il nous faut. Écrite en VB, compatible VBA, elle va prendre en charge tout le travail de transformation des données JSON.
- Téléchargez VB-JSON sur cette page.
- Décompressez le fichier
vbjson.zip
téléchargé. Vous devriez obtenir ceci : - Tous ces fichiers sont prévus pour Visual Basic 6, la plupart sont inutiles pour Access. En pratique, ceux qui nous intéressent sont seulement
JSON.bas
(le module contenant les fonctions principales), etcStringBuilder.cls
(module de classe servant à accélérer les traitements de chaînes).
Préparer la base de données
- Ouvrez votre base de données Access, et passez dans Visual Basic Editor (
Alt
+F11
, par exemple). - Le convertisseur utilise des objets
Dictionary
qui sont fournis par une autre bibliothèque : Microsoft Scripting Runtime. Pour activer cette bibliothèque, cliquez sur le menu Outils / Références, et cochez-la dans la liste. Descendez, descendez encore, plus bas… la voilà ! 🙂 - VB-JSON peut être aussi amené à utiliser des objets
ADODB.Recordset
. Dans Outils / Références, cochez Microsoft ActiveX Data Objects x.y Library.
Importer la bibliothèque VB-JSON
- Cliquez sur le menu Fichier / Importer un fichier, sélectionnez
cStringBuilder.cls
, et validez. - Répétez l’opération pour
JSON.bas
. - Pour confirmer que tout est ok, cliquez sur le menu Débogage / Compiler. Si ça ne marche pas, vérifiez que vous avez bien coché les bonnes bibliothèques, plus haut.
Petit bug
Sur une machine française (par exemple), avec la virgule comme séparateur décimal, vous risquez d’avoir quelques petits soucis sur les conversions numériques. Pour résoudre ce (futur) problème :
- Ajoutez quelque part, dans un module standard, la fonction
DecimalSep()
traitée dans cet article du Grenier. - Ouvrez le module
JSON
(importé plus haut). - Trouvez la fonction
parseNumber()
. - Dans cette fonction, remplacez la ligne :
parseNumber = CDec(Value)
par celle-ci :
parseNumber = CDec(Replace(Value, ".", DecimalSep()))
Hop là, vous êtes prêt pour la suite…
Newbie8 > Les sites Web peuvent fournir leurs données sous différents formats : HTML (le classique), XML, JSON… Le principe décrit dans l’article s’applique aux autres formats (l’article est d’ailleurs dérivé d’une série sur les flux RSS/XML). Maintenant, tout dépend de la structure des données fournie par le site ; les données seront retraitées différemment en fonction de cette structure.
Bonjour,
J’aimerais savoir si je peux trouver sur ce site comment récupérer les données à partir de n’importe quel site sans qu’il soit nécessairement en javascript. D’ailleurs, comment peut on savoir de quel type est le site web?
Je m’excuse pour ces questions très drôles.
Merci.
Vincent > Après un test rapide, l’encodage sera un plus, mais ce n’est pas lui le responsable. Tout simplement, si tu affiches les résultats dans la fenêtre Debug, tu ne vois que la fin de la réponse JSON (la fenêtre Debug est limitée en volume). Du coup, ça peut laisser penser que la distance est de 3.1 km, mais il s’agit seulement d’une distance d’étape. La distance réelle (et correcte) figure en début de JSON.
Je poste un article là-dessus dès que j’ai un moment.
Vincent > Merci pour le retour, ça intéressera d’autres personnes.
Je jetterai un œil pour voir d’où vient le problème de distance (problème d’encodage peut-être ?)
Voila donc pour ceux que ça intéresse, voici le code adapté pour avoir un retour de Google MAP selon la méthode d’Hervé pour traiter les JSON.
voici les paramètres de l’API Google : https://developers.google.com/maps/…
Le seul bémol est que le retour n’est a priori pas bon (paris -> Rennes 3 KM ???)
Sinon vous pouvez partir sur la version XML en adaptant le code Gmap et en suivant la formation d’Hervé : Lecture de flux RSS.
En espérant que cela en aide certain.
Code VBA :
Function LectureGmap() As String
Dim strURL As String
Dim http As MSXML2.ServerXMLHTTP
Dim TrajetDepart As String
Dim TrajetArrive As String
TrajetDepart = « Rue de Paris,Rennes, »
TrajetArrive = « Rue de Rivoli, Paris »
‘ URL du flux à lire
strURL = « http://maps.googleapis.com/maps/api… » & TrajetDepart & « &destination= » & TrajetArrive & « &sensor=false&units=metric »
‘ Lecture du flux
Set http = New MSXML2.ServerXMLHTTP
http.Open « POST », strURL, False
http.send « »
‘ En cas de réussite, le code renvoyé est 200
If (http.status <> 200) Then
LectureGmap = « »
Else
‘ Transformation du JSON en VBA
LectureGmap = http.responseText
End If
‘ On libère les objets
Set http = Nothing
End Function
Bonjour Hervé,
j’ai recommencé du début a partir d’une nouvelle BDD (La BDD sur laquelle je travaille a trop de références cochées…) et du coups cela fonctionne a merveille…
Merci.
Bonsoir Hervé,
oui la bibliothèque est bien cochée…c’est le mot « new » qui pose problème.
Je n’ai pas trouvé pourquoi !!!
Je recommencerai sur une bdd vierge, ça joue peut être.
Du coups, j ai contourné et je suis repassé au format XML pour récupérer les donnees de Google Maps.
Cependant la version Json me retournais bien les données mais je n’avais pas réussi à les exploiter. C est fait avec le XML et grâce entre autre a vos tutos sur les flux rss.
Merci beaucoup.
Vincent
Vincent >
Scripting.Dictionary
est un objet de la bibliothèque Microsoft Scripting Dictionary. Est-ce qu’elle est cochée ?Bonjour Hervé,
J’ai une erreur lorsque je compile j’ai ce message d’erreur :
Erreur de compilation : Utilisation incorrecte du mot clé New
et le débogage s’arrete sur cette ligne :
Set parseObject = New Dictionary
de la fonction : Private Function parseObject(ByRef str As String, ByRef index As Long) As Dictionary
J’ai pourtant bien suivi toutes les étapes et j’ai bien toutes les références cochées…
Auriez vous une idée de ce qui bloque?
Merci.
Vincent.