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

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 01:05:29828parcourir

 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>

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>

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!

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