Je souhaite utiliser la bibliothèque jackson json pour une méthode générique comme suit:
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{
private List<T> myobjects;
public void setMyObjects(List<T> ets) {
this.myobjects = ets;
}
@NotNull
@JsonIgnore
public T getMyObject() {
return myobjects.get(0);
}
}
Maintenant, le problème est que lorsque j'appelle getMyObject () qui se trouve à l'intérieur de l'objet de requête, jackson renvoie l'objet personnalisé imbriqué en tant que LinkedHashMap. Existe-t-il un moyen de spécifier que l'objet T doit être retourné?. Par exemple: si j'ai envoyé un objet de type Client, alors le Client doit être renvoyé de cette Liste ?.
Merci.
TypeReference
abstrait?Réponses:
C'est un problème bien connu avec l'effacement de type Java: T est juste une variable de type, et vous devez indiquer la classe réelle, généralement comme argument de classe. Sans ces informations, le mieux que l'on puisse faire est d'utiliser des limites; et T simple est à peu près identique à «T étend l'objet». Et Jackson liera ensuite les objets JSON en tant que cartes.
Dans ce cas, la méthode du testeur doit avoir accès à la classe et vous pouvez construire
puis
la source
«JavaType» fonctionne !! J'essayais de démarshall (désérialiser) une liste dans json String en ArrayList java Objects et j'avais du mal à trouver une solution depuis des jours.
Voici le code qui m'a finalement apporté une solution. Code:
la source
IOException
(nécessite juste une capture), et que l'introspecteur d'annotation par défaut est déjàJacksonAnnotationIntrospector
- donc pas besoin de faire quoi que ce soitObjectMapper
, il suffit de le construire et cela fonctionne.J'ai modifié la réponse de rushidesai1 pour inclure un exemple fonctionnel.
JsonMarshaller.java
Production
JsonMarshallerUnmarshaller.java
Station.java
data.json
la source