Maison >Java >javaDidacticiel >Comment désérialiser des objets génériques imbriqués avec Jackson : un guide d'utilisation de TypeReference et JavaType

Comment désérialiser des objets génériques imbriqués avec Jackson : un guide d'utilisation de TypeReference et JavaType

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-26 00:00:03628parcourir

How to Deserialize Nested Generic Objects with Jackson:  A Guide to Using TypeReference and JavaType

Référence de type Jackson et générique : gestion des objets génériques imbriqués

La bibliothèque Jackson JSON permet une gestion puissante des structures d'objets complexes. Cependant, un défi courant se pose lorsque l'on travaille avec des types génériques dans des objets personnalisés.

Énoncé du problème :

Considérez le code suivant :

<code class="java">public class MyWrapper<T> {

    private MyRequest<T> request;

    // ... getters and setters
}

public class MyRequest<T> {

    private List<T> myobjects;

    // ... getters and setters
}</code>

Une méthode générique tente de désérialiser un objet JSON dans une instance MyWrapper :

<code class="java">public MyRequest<T> tester() {
    TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
    MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
    return requestWrapper.getRequest();
}</code>

Le problème se produit lors de l'appel de getMyObject() sur l'objet MyRequest imbriqué. Jackson renvoie un LinkedHashMap au lieu d'une instance du type T souhaité. Cela se produit car l'effacement du type Java supprime les informations de type lors de la compilation.

Solution :

Pour spécifier le type exact T qui doit être renvoyé, vous devez fournir à Jackson des informations supplémentaires sur le type. Ceci peut être réalisé en utilisant la classe JavaType du mappeur Jackson.

<code class="java">JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class);</code>

Remplacez la ligne dans la méthode tester() par :

<code class="java">TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
JavaType requestType = mapper.getTypeFactory().
  constructCollectionType(MyRequest.class, type.getType());
MyWrapper<T> requestWrapper = 
  (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, requestType);</code>

Cela indique maintenant à Jackson de s'attendre à un Liste du type Foo donné. Lors de la désérialisation de l'objet JSON, il le traduira dans le type correct.

En fournissant à Jackson ces informations de type supplémentaires, vous pouvez gérer les objets génériques imbriqués avec précision, en garantissant que les objets sont du type correct une fois récupérés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn