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.

  1. Téléchargez VB-JSON sur cette page.
  2. Décompressez le fichier vbjson.zip téléchargé. Vous devriez obtenir ceci :vbjson-fichiers.jpg
  3. 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), et cStringBuilder.cls (module de classe servant à accélérer les traitements de chaînes).

Préparer la base de données

  1. Ouvrez votre base de données Access, et passez dans Visual Basic Editor (Alt + F11, par exemple).
  2. 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à ! 🙂
  3. 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

  1. Cliquez sur le menu Fichier / Importer un fichier, sélectionnez cStringBuilder.cls, et validez.
  2. Répétez l’opération pour JSON.bas.
  3. 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 :

  1. Ajoutez quelque part, dans un module standard, la fonction DecimalSep() traitée dans cet article du Grenier.
  2. Ouvrez le module JSON (importé plus haut).
  3. Trouvez la fonction parseNumber().
  4. 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…

Vous aimerez aussi...

9 réponses

  1. Hervé Inisan dit :

    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.

  2. Newbie8 dit :

    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.

  3. Hervé Inisan dit :

    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.

  4. Hervé Inisan dit :

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

  5. Vincent dit :

    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

  6. Vincent dit :

    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.

  7. Vincent dit :

    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

  8. Hervé Inisan dit :

    Vincent > Scripting.Dictionary est un objet de la bibliothèque Microsoft Scripting Dictionary. Est-ce qu’elle est cochée ?

  9. Vincent dit :

    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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *