Mappage d'objets avec la bibliothèque Jackson

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons apprendre à utiliser la classe ObjectMapper de Jackson pour mapper des objets au format JSON et vice versa. Nous utiliserons une classe Java simple appelée DemoClass et découvrir diverses techniques pour lire et écrire des données JSON.

Créer et compiler DemoClass

Créez un nouveau projet dans le répertoire ~/projet et créez une nouvelle classe Java DemoClass. Collez le code suivant dans le fichier de code DemoClass.java.

import java.util.Date;

public class DemoClass {
    private String field1;
    private Double field2;
    private Date dateField;

    // Constructeurs
    DemoClass() {}

    DemoClass(String field1, Double field2, Date dateField) {
        this.field1 = field1;
        this.field2 = field2;
        this.dateField = dateField;
    }

    // getters et setters
    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public Double getField2() {
        return field2;
    }

    public void setField2(Double field2) {
        this.field2 = field2;
    }

    public Date getDateField() {
        return dateField;
    }

    public void setDateField(Date dateField) {
        this.dateField = dateField;
    }
}

Compilez la classe Java DemoClass à l'aide de la commande suivante :

javac DemoClass.java

Lecture d'objets à partir d'un fichier JSON

Nous pouvons utiliser la méthode readValue() de la classe ObjectMapper pour lire les données d'un fichier JSON dans un objet. Notre fichier JSON contient juste les paires propriété-valeur d'un seul objet.

Créez un nouveau fichier nommé demo.json et collez le contenu JSON suivant dedans.

{
    "field1": "Sample-1",
    "field2": 20.21,
    "dateField": "2021-07-30T14:20:30.000Z"
}

Utilisez le code suivant pour lire le fichier JSON et le mapper à un objet DemoClass.

import java.io.File;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ObjectMapperDemo {
    public static void main(String[] args) {
        try {
            String filePath = "demo.json";
            File file = new File(filePath);

            ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            DemoClass obj = objMapper.readValue(file, DemoClass.class);

            System.out.println("Field1: " + obj.getField1());
            System.out.println("Field2: " + obj.getField2());
            System.out.println("DateField: " + obj.getDateField());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

La sortie sera :

Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021

Lecture d'objets à partir d'une chaîne JSON

Nous pouvons lire des données à partir d'une chaîne JSON dans un objet. Nous utiliserons la méthode readValue() de la classe ObjectMapper. Nous devons également passer le type de classe à cette méthode.

Ajoutez le code suivant pour lire des données à partir d'une chaîne JSON.

String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";

ObjectMapper objMapper = new ObjectMapper();
DemoClass obj = objMapper.readValue(jsonString, DemoClass.class);

System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());

La sortie sera :

Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021

Lecture d'objets à partir d'une URL JSON

La lecture d'objets à partir d'une URL est également assez simple. Nous devons passer l'objet URL et le type de classe à la méthode readValue().

Ajoutez le code suivant pour lire et mapper des objets à partir d'une URL JSON.

import java.net.URL;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ObjectMapperDemo {
    public static void main(String[] args) {
        try {
            URL jsonFileUrl = new URL("file:demo.json");
            ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            DemoClass obj = objMapper.readValue(jsonFileUrl, DemoClass.class);

            System.out.println("Field1: " + obj.getField1());
            System.out.println("Field2: " + obj.getField2());
            System.out.println("DateField: " + obj.getDateField());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

La sortie sera la même que dans l'Étape 2.

Lecture à partir d'un tableau de chaînes JSON vers un tableau d'objets

Supposons qu'une chaîne contienne des données de plusieurs objets (en tant que tableau) au format JSON. Nous pouvons lire toutes ces données dans un tableau du type DemoClass à l'aide de la classe ObjectMapper.

Ajoutez le code suivant pour lire des objets à partir d'un tableau de chaînes JSON vers un tableau d'objets.

String jsonString = " [{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}," +
        " {\"field1\":\"Sample-2\",\"field2\":22.55,\"dateField\":\"2021-07-31T14:20:30.000Z\"}]";

ObjectMapper objMapper = new ObjectMapper();
DemoClass[] objectArr = objMapper.readValue(jsonString, DemoClass[].class);

for (DemoClass obj : objectArr) {
    System.out.println("Field1: " + obj.getField1());
    System.out.println("Field2: " + obj.getField2());
    System.out.println("DateField: " + obj.getDateField());
    System.out.println();
}

La sortie sera :

Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021

Field1: Sample-2
Field2: 22.55
DateField: Sat Jul 31 14:20:30 UTC 2021

Lecture à partir d'un tableau de chaînes JSON vers une liste d'objets

Nous pouvons lire les objets dans une liste si nous ne voulons pas lire les données dans un tableau d'objets de taille fixe.

Ajoutez le code suivant pour lire des objets à partir d'un tableau de chaînes JSON vers une liste d'objets.

String jsonString = " [{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}," +
        " {\"field1\":\"Sample-2\",\"field2\":22.55,\"dateField\":\"2021-07-31T14:20:30.000Z\"}]";

ObjectMapper objMapper = new ObjectMapper();
ArrayList<DemoClass> objectList = objMapper.readValue(jsonString, new TypeReference<ArrayList<DemoClass>>(){});

for (DemoClass obj : objectList) {
    System.out.println("Field1: " + obj.getField1());
    System.out.println("Field2: " + obj.getField2());
    System.out.println("DateField: " + obj.getDateField());
    System.out.println();
}

La sortie sera la même que dans l'Étape 5.

Lecture à partir d'un tableau de chaînes JSON vers une carte d'objets

Nous pouvons également lire des données à partir d'une chaîne JSON dans une carte. Chaque propriété de la classe deviendra une clé, et la valeur de la propriété deviendra la valeur.

Ajoutez le code suivant pour lire des données à partir d'un tableau de chaînes JSON dans une carte.

String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";

ObjectMapper objMapper = new ObjectMapper();
Map<String, Object> objectMap = objMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});

for (Map.Entry<String, Object> entry : objectMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

La sortie sera :

field1: Sample-1
field2: 20.21
dateField: 2021-07-30T14:20:30.000Z

Lecture de JSON dans un objet JsonNode

La classe JsonNode nous offre une manière plus flexible d'analyser le JSON. Nous pouvons utiliser la méthode readTree() de la classe ObjectMapper pour lire le JSON dans un objet JsonNode.

Ajoutez le code suivant pour lire le JSON dans un objet JsonNode.

String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";

ObjectMapper objMapper = new ObjectMapper();
JsonNode node = objMapper.readTree(jsonString);

System.out.println("Field1: " + node.get("field1").asText());
System.out.println("Field2: " + node.get("field2").asDouble());
System.out.println("DateField: " + node.get("dateField").asText());

La sortie sera la même que dans l'Étape 2.

Configuration d'ObjectMapper

Nous pouvons configurer ObjectMapper de manière à ce qu'il puisse fonctionner avec des entrées inattendues.

Ajoutez le code suivant pour configurer ObjectMapper pour ignorer toute nouvelle propriété.

String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"field3\":\"Unknown\"}";

ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(jsonString, DemoClass.class);

System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());

La sortie sera la même que dans l'Étape 2.

Travailler avec les dates

Par défaut, ObjectMapper mappera une java.util.date sur une valeur long. Cette valeur long est le nombre de millisecondes écoulées depuis le 1er janvier 1970.

Ajoutez le code suivant pour démontrer comment définir un format de date à l'aide de SimpleDateFormat pour sérialiser la java.util.date.

ObjectMapper objMapper = new ObjectMapper();

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
objMapper.setDateFormat(dateFormat);

DemoClass obj = new DemoClass("Sample-1", 20.21, new Date());
String jsonString = objMapper.writeValueAsString(obj);

System.out.println(jsonString);

La sortie sera :

{"field1":"Sample-1","field2":20.21,"dateField":"30-07-2021"}

Récapitulatif

Dans ce laboratoire, nous avons appris à utiliser la classe ObjectMapper de Jackson pour mapper des objets en JSON et JSON en objets. Nous avons appris à lire un fichier JSON dans un objet, à lire des données à partir d'une chaîne JSON et à les mapper dans un objet, et à lire des objets à partir d'un tableau de chaînes JSON dans une liste ou un tableau d'objets. Nous avons également appris à lire une chaîne JSON dans un objet JsonNode et à configurer ObjectMapper pour ignorer les nouvelles propriétés ou les valeurs nulles pour les types primitifs. Enfin, nous avons appris à travailler avec les dates et à utiliser un format de date spécifique lors de la sérialisation de la java.util.date.