Importer un fichier JSON dans une base de données Access
par
, 17/07/2020 à 21h47 (3988 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...".
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 :
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