Aller au contenu

Sérialisation Json

Un format plus populaire pour partager des données est sans aucun doute le json. Créer des documents json en Java est aussi simple que la sérialisation binaire, avec comme bonus ajouté que le fichier sera entièrement lisible et portable.

Importer la dépendance

Contrairement à la sérialisation binaire, qui est inclue dans Java, la gestion des fichiers json est occupée par des librairies externes. Plusieurs librairies existent, mais celle choisie pour le cours est com.google.code.gson.

Pour importer la dépendance, il suffit de l'ajouter dans son fichier pom.xml et de synchroniser les dépendances avec maven.

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>DemoSerialisation</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
        </dependency>
    </dependencies>

</project>

Écriture vers un fichier

L'écriture vers un fichier json est un peu différent que pour un fichier binaire.

// Création d'un tableau d'étudiants
ArrayList<Etudiant> etudiants = new ArrayList<>(Arrays.asList(
        new Etudiant("Tremblay", "Jean", "123456"),
        new Etudiant("Gagnon", "Marie", "654321"),
        new Etudiant("Lavoie", "Pierre", "456789")
));

// Écriture vers un fichier
try {
    Gson gson = new Gson();
    String json = gson.toJson(etudiants, ArrayList.class); // (1)
    FileWriter writer = new FileWriter("etudiants.json");
    writer.write(json);
    writer.close(); // (2)
} catch (IOException e) {
    throw new RuntimeException(e);
}

  1. Il est important de spécifier le type de classe qui sera sérialisé. Dans l'exemple, c'est un ArrayList.
  2. Il est important de fermer le fichier, sinon de la corruption pourrait survenir.

Note

En sérialisation binaire, les classes anonymes pouvaient causer des problèmes de désérialisation. Aucun problème à les utiliser en json.

Lecture d'un fichier

La lecture d'un fichier json est aussi facile que pour un fichier binaire.

// Désérialisation
Etudiant[] etudiantsRecuperes;
try {
    Gson gson = new Gson();
    BufferedReader br = new BufferedReader(new FileReader("etudiants.json"));
    etudiantsRecuperes = gson.fromJson(br, Etudiant[].class);
} catch (IOException e) {
    throw new RuntimeException(e);
}

// Afficher les étudiants
for (Etudiant etudiant : etudiantsRecuperes) {
    System.out.println(etudiant.getNom());
}

Important de noter que des arrays simples doivent être utilisés. On peut voir à la ligne 2 que ce n'est pas un ArrayList qui sera utilisé, mais bien un array d'Etudiant. Pour obtenir un ArrayList, il faudrait le convertir :

ArrayList<Etudiant> etudiantsRecuperesListe = new ArrayList<>(Arrays.asList(etudiantsRecuperes));

Portabilité

La portabilité d'un fichier json n'est plus à démontrer. Ce simple fichier texte permet à n'importe qui de le lire aisément, en plus de pouvoir le transférer facilement vers n'importe quel autre langage :

etudiants.json
[
  {
    "nom": "Tremblay",
    "prenom": "Jean",
    "noEtudiant": "123456",
    "notes": {
      "INF3135": 30.072731,
      "INF1130": 73.662056,
      "INF2120": 64.6835,
      "INF1120": 65.3539,
      "INF3143": 13.757491
    }
  },
  {
    "nom": "Gagnon",
    "prenom": "Marie",
    "noEtudiant": "654321",
    "notes": {
      "INF3135": 16.87798,
      "INF1130": 50.10571,
      "INF2120": 82.118996,
      "INF1120": 7.8551474,
      "INF3143": 74.37621
    }
  },
  {
    "nom": "Lavoie",
    "prenom": "Pierre",
    "noEtudiant": "456789",
    "notes": {
      "INF3135": 32.225983,
      "INF1130": 18.357807,
      "INF2120": 67.352066,
      "INF1120": 70.130165,
      "INF3143": 98.514565
    }
  }
]