Maison > Java > javaDidacticiel > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-10-26 00:00:03
original
537 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!