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!