Maison > Java > javaDidacticiel > le corps du texte

Comment désérialiser un type générique dans un objet JSON à l'aide de Jackson en Java ?

Barbara Streisand
Libérer: 2024-10-31 01:05:29
original
825 Les gens l'ont consulté

 How do I deserialize a generic type within a JSON object using Jackson in Java?

Jackson et référence des types génériques

En Java, les génériques sont utilisés pour représenter des types qui peuvent être paramétrés avec d'autres types. Cela permet une réutilisation du code et une plus grande flexibilité. Cependant, lorsque vous travaillez avec JSON à l'aide de Jackson, les types génériques peuvent poser certains défis.

Un problème courant survient lors de l'accès aux propriétés génériques au sein d'un objet JSON. Considérez le code Java suivant :

<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();
}

public class MyWrapper<T> {
    private MyRequest<T> request;
    public MyRequest<T> getRequest() { return request; }
    public void setRequest(MyRequest<T> request) { this.request = request; }
}

public class MyRequest<T> {
    private List<T> myobjects;
    public void setMyObjects(List<T> ets) { this.myobjects = ets; }
    @NotNull
    @JsonIgnore
    public T getMyObject() { return myobjects.get(0); }
}</code>
Copier après la connexion

Lors de l'appel de getMyObject(), qui se trouve dans l'objet MyRequest, Jackson renvoie l'objet personnalisé imbriqué sous la forme d'un LinkedHashMap. En effet, Jackson ne peut pas déterminer le type réel de T sur la seule base de la déclaration générique.

Pour résoudre ce problème et spécifier le type de T, un argument de classe explicite est requis. Cela peut être fait en construisant un objet JavaType, comme suit :

<code class="java">TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>() {};
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, Foo.class);
MyWrapper<Foo> requestWrapper = mapper.readValue(jsonRequest, type);</code>
Copier après la connexion

Dans cet exemple, la classe Foo représente le type réel de T. En construisant un JavaType avec le type souhaité, Jackson peut désérialiser correctement le Objet JSON et renvoie le type correct de T.

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!