Voir le flux RSS

User

Importer un fichier JSON dans une base de données Access

Noter ce billet
par , 17/07/2020 à 21h47 (396 Affichages)
Objectif : Comprendre les règles de transformation d'un fichier JSON en base de données Access, puis implémenter la fonction d'importation du fichier dans votre application.


I. Introduction

Après avoir détaillé la structure générale d'un fichier JSON (JavaScript Object Notation ), on décrira les règles de transformation du fichier en une base de données Access : les structures d'objets deviennent des tables et les dépendances entre objets deviennent des liens entre des tables. Puis, on présentera brièvement la fonction d'importation du fichier.

Enfin, on proposera un outil à télécharger contenant les modules à importer dans votre application pour implémenter cette fonction.

Cet utilitaire contient entre autre le module JsonConverter de Tim Hall, destiné à créer, à partir d'un fichier JSON, des objets Dictionary ou Collection. Il nécessite de référencer la librairie Microsoft Scripting runtime.


II. Structure JSON

Dans un fichier JSON les parties délimitées par des crochets [] représentent des tableaux d'éléments, et ce qui est entre accolades {} définit la structure d'un objet.

Considérons un fichier personne.json de contenu :

Code json : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "nomPersonne": "Dupont",
  "prenomPersonne": "Jean",
  "age": 35,
  "addresse": {
    "rue": "24 avenue des peupliers",
    "codePostal": "75000",
    "ville": "Paris"
  },
  "contacts": [
    {
      "nomContact": "Martin",
      "prenomContact": "Vincent",
      "telephoneContact": "01 01 01 01 01"
    },
    {
      "nomContact": "Cousin",
      "prenomContact": "Olivier",
      "telephoneContact": "02 01 01 01 01"
    }
  ],
}

On voit qu'on a une structure d'objet avec des attributs simples (nomPersonne prenomPersonne, age) et des attributs composites (adresse,contacts).


III. Règles de passage de la structure JSON à la base de données

La structure d'objet principal avec ses propriétés simples (nomPersonne prenomPersonne, age) sera transformé en une table personne avec les mêmes attributs. On ajoutera à la table une clé primaire ID_personne pour identifier chaque enregistrement.

Les autres attributs adresse et contacts ont eux-mêmes une structure d'objet :

La structure d'objet adresse avec les propriétés (rue, codePostal et ville) sera transformé en une table adresse_personne avec les mêmes attributs.

On ajoutera à cette table une clé primaire ID_adresse_personne, et une clé étrangère FK_Personne pour faire le lien avec la table principale Personne.

Cette table comportera un seul enregistrement.

L'attribut contacts représente en fait un tableau d'objets ayant la même structure (nomContact, prenomContact, telephoneContact). Il sera transformé en une table contacts_personne avec les mêmes attributs.

On ajoutera à cette table une clé primaire ID_contacts_personne, et une clé étrangère FK_Personne pour faire le lien avec la table principale Personne.

Cette table comportera 2 enregistrements pour les 2 éléments du tableau.

La fonction d'importation va donc créer les tables suivantes :

  • personne(ID_Personne, nomPersonne, prenomPersonne, age) ;
  • adresse_personne(ID_adresse_personne,FK_personne,rue,codePostal,ville) ;
  • contacts_personne(ID_contacts_personne,FK_personne,nomContact,prenomContact,telephoneContact).


On remarque qu'il y a des liaisons implicites sur les champs ID_personne et FK_Personne, avec une relation 1-à-1 entre les tables personne et adresse_personne et une relation 1-à-plusieurs entre les tables personne et contacts_personne.

Ces tables contiendront bien sûr les données du fichier JSON.

On peut également avoir un tableau comme structure principale :

Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[
  { 
    "nomPersonne": "Dupont",
    "prenomPersonne": "Jean",
    "age": 35,
    "addresse": {
      "rue": "24 avenue des peupliers",
      "codePostal": "75000",
      "ville": "Paris"
    },
    "contacts": [
      {
        "nomContact": "Martin",
        "prenomContact": "Vincent",
        "telephoneContact": "01 01 01 01 01"
      },
      {
        "nomContact": "Cousin",
        "prenomContact": "Olivier",
        "telephoneContact": "02 01 01 01 01"
      }
    ]
  },
  {
    "nomPersonne": "Durand",
    "prenomPersonne": "Yves",
    "age": 45,
    "addresse": {
      "rue": "24 avenue des peupliers",
      "codePostal": "69000",
      "ville": "Lyon"
    },
    "contacts": [
      {
        "nomContact": "Martin",
        "prenomContact": "Hélène",
        "telephoneContact": "03 01 01 01 01"
      },
      {
        "nomContact": "Cousin",
        "prenomContact": "Thierry",
        "telephoneContact": "04 01 01 01 01"
      }
    ]
  }
]

Dans ce cas, la table principale personne contiendra 2 enregistrements.


IV. Importation du fichier JSON

Déroulé de la fonction d'importation :

  • choix du fichier JSON sur le disque à l'aide de Filedialog ;
  • conversion du contenu du fichier en objet Dictionary ou Collection avec la fonction ParseJson du module JsonConverter ;
  • transformation des objets en tables ou importation simple des données à l'aide de la fonction ImportJsonFile.


Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Public Function ImportJsonFile() As Boolean
    ' fonction principale qui permet d'importe le fichier JSON dans la base de données
    On Error GoTo err_ImportJsonFile
    Dim jsonObject As Object
    Dim FileName As String, jsonString As String
    Dim fDialog As Object
 
    ' On créé une boîte de dialogue pour choisir un fichier json
    Set fDialog = Application.FileDialog(3) '3: msoFileDialogFilePicker
 
    With fDialog
 
        ' sélection simple des fichiers : 1 seul à la fois
        .AllowMultiSelect = False
 
        ' titre de la boîte de dialogue
        .Title = "Choisir un fichier json"
 
        ' on efface les filtres antérieurs
        .Filters.Clear
        .Filters.Add "JSON Files (*.json)", "*.json" ' on filtre pour n'afficher que les fichiers json
 
        If .Show = True Then ' si on a choisi un fichier
 
            FileName = .SelectedItems(1) ' on copie le chemin du fichier dans une variable
            jsonString = ReadFile(FileName) ' on copie le contenu du fichier json dans une chaîne de caractères
 
            Set jsonObject = ParseJson(jsonString) ' on crée l'objet avec la structure et les données du fichier Json
 
            FileName = ExtractFileName(FileName) ' on extrait le nom du fichier sans son extension, il sera le nom de la table principale.
 
            If MakeDB(jsonObject, FileName, "", 0) Then  ' on créé ou met à jour les tables de la base de données à partir de l'objet json
                ImportJsonFile = True ' indique que l'opération s'est bien passée
            End If
 
            RefreshDatabaseWindow ' on rafraîchit la fenêtre de la base de données.
 
        End If
 
    End With
 
err_ImportJsonFile:
    ' gestion d'erreur
    If Err.Number <> 0 Then
        MsgBox (Err.Description)
        ImportJsonFile = False ' indique à la procédure appelante qu'il y a eu une erreur
    End If
 
End Function

Si les tables ont déjà été créées une première fois, les fois suivantes elle n'importera que les données.

Le code utilise DAO pour créer les tables.


V. Base jointe

Pour tester l'outil, il faut ouvrir le formulaire F_Import_Json_File, et cliquer sur "Importer un fichier JSON dans la base de données...".

Nom : F_Import_Json_File.png
Affichages : 121
Taille : 14,0 Ko

Pour intégrer la fonction d'importation dans votre application vous devez y ajouter les modules JsonConverter et M_Import_Json_File, et cocher la référence Microsoft Scripting runtime

Si vous recevez un message d'erreur comme celui-ci lors des tests :

Nom : message_erreur.png
Affichages : 121
Taille : 3,5 Ko

Cela vient de la fonction ParseJson du module JsonConverter qui n'a pas reconnu la structure de votre fichier JSON.

Attention : les éléments des tableaux dans les fichiers JSON doivent avoir la même structure pour être transformés en tables, dans le cas contraire il peut y avoir un message d'erreur.

Si les nombres enregistrés dans le fichier JSON comportent plus de 15 chiffres, il ne peuvent être copiés dans des champs du type réel double. Dans ce cas, préférer le type texte et modifiez la fonction FieldType comme ceci :

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Private Function FieldType(ByRef JsonValue) As Variant
    ' converti un type de variable VBA en type de données d'un champ de table
    Select Case VBA.VarType(JsonValue)
        ...
        Case VBA.vbDouble
            FieldType = dbText 'dbDouble
        ...
    end select
 
End Function

Bons tests à tous
Miniatures attachées Fichiers attachés

Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Viadeo Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Twitter Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Google Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Facebook Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Digg Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Delicious Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog MySpace Envoyer le billet « Importer un fichier JSON dans une base de données Access » dans le blog Yahoo

Mis à jour 31/07/2020 à 21h02 par User

Catégories
Access , VBA

Commentaires