Java Language Désérialisation JSON personnalisée avec Jackson


Exemple

Nous consommons l'API de repos en tant que format JSON, puis la désactivons sur un POJO. Le fichier org.codehaus.jackson.map.ObjectMapper de Jackson fonctionne simplement et nous ne faisons rien dans la plupart des cas. Mais parfois, nous avons besoin d'un désérialiseur personnalisé pour répondre à nos besoins personnalisés et ce tutoriel vous guidera tout au long du processus de création de votre propre désérialiseur.

Disons que nous avons des entités suivantes.

public class User {
    private Long id;
    private String name;
    private String email;

    //getter setter are omitted for clarity 
}

Et

public class Program {
    private Long id;
    private String name;
    private User createdBy;
    private String contents;

    //getter setter are omitted for clarity
}

Sérialisons / marshalons un objet en premier.

User user = new User();
user.setId(1L);
user.setEmail("example@example.com");
user.setName("Bazlur Rahman");

Program program = new Program();
program.setId(1L);
program.setName("Program @# 1");
program.setCreatedBy(user);
program.setContents("Some contents");

ObjectMapper objectMapper = new ObjectMapper();

final String json = objectMapper.writeValueAsString (programme); System.out.println (json);

Le code ci-dessus produira après JSON-

{
    "id": 1,
    "name": "Program @# 1",
    "createdBy": {
        "id": 1,
        "name": "Bazlur Rahman",
        "email": "example@example.com"
    },
    "contents": "Some contents"
}

Maintenant, peut faire le contraire très facilement. Si nous avons ce JSON, nous pouvons supprimer un objet programme en utilisant ObjectMapper comme suit -

Maintenant, disons que ce n'est pas le cas réel, nous allons avoir un JSON différent d'une API qui ne correspond pas à notre classe de Program .

{
"id": 1,
"name": "Program @# 1",
"ownerId": 1
"contents": "Some contents"
}

Regardez la chaîne JSON, vous pouvez voir, il a un champ différent qui est owenerId.

Maintenant, si vous souhaitez sérialiser ce JSON comme nous l'avons fait précédemment, vous aurez des exceptions.

Il existe deux manières d’éviter les exceptions et d’avoir cette publication en série -

Ignorer les champs inconnus

Ignorer le onwerId . Ajouter l'annotation suivante dans la classe Programme

@JsonIgnoreProperties(ignoreUnknown = true)
public class Program {}

Ecrire un désérialiseur personnalisé

Mais il y a des cas où vous avez réellement besoin de ce champ owerId . Disons que vous voulez le relier comme identifiant de la classe User .

Dans ce cas, vous devez écrire un désérialiseur personnalisé.

Comme vous pouvez le voir, vous devez d'abord accéder au JsonNode depuis le JonsParser . Et puis, vous pouvez facilement extraire des informations d'un JsonNode utilisant la méthode get() . et vous devez vous assurer du nom du champ. Ce devrait être le nom exact, la faute d'orthographe entraînera des exceptions.

Et enfin, vous devez enregistrer votre ProgramDeserializer dans ObjectMapper .

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Program.class, new ProgramDeserializer());
 
mapper.registerModule(module);
 
String newJsonString = "{\"id\":1,\"name\":\"Program @# 1\",\"ownerId\":1,\"contents\":\"Some contents\"}";
final Program program2 = mapper.readValue(newJsonString, Program.class);

Vous pouvez également utiliser l’annotation pour enregistrer le désérialiseur directement -

@JsonDeserialize(using = ProgramDeserializer.class)
public class Program {
}