Quiero usar la biblioteca jackson json para un método genérico de la siguiente manera:
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);
}
}
Ahora el problema es que cuando llamo a getMyObject () que está dentro del objeto de solicitud, jackson devuelve el objeto personalizado anidado como LinkedHashMap. ¿Hay alguna forma en la que especifique que el objeto T debe devolverse? Por ejemplo: si envié un objeto de tipo Cliente, ¿el Cliente debería ser devuelto de esa Lista ?.
Gracias.
TypeReference
abstracto?Respuestas:
Este es un problema bien conocido con el borrado de tipo Java: T es solo una variable de tipo y debe indicar la clase real, generalmente como argumento de clase. Sin esa información, lo mejor que se puede hacer es utilizar límites; y T simple es aproximadamente lo mismo que "T extiende el objeto". Y Jackson luego vinculará objetos JSON como mapas.
En este caso, el método de prueba debe tener acceso a la clase y puede construir
y entonces
fuente
¡¡'JavaType' funciona !! Estaba tratando de deshacer (deserializar) una Lista en json String para ArrayList java Objects y estaba luchando por encontrar una solución desde hace días.
A continuación se muestra el código que finalmente me dio la solución. Código:
fuente
IOException
(solo necesita una captura), y que el introspector de anotaciones predeterminado yaJacksonAnnotationIntrospector
lo es , por lo que no es necesario hacer nadaObjectMapper
, solo constrúyalo y funciona.He modificado respuesta de rushidesai1 para incluir un ejemplo de trabajo.
JsonMarshaller.java
Salida
JsonMarshallerUnmarshaller.java
Station.java
data.json
fuente