Estoy tratando de crear una clase genérica para usar con Google Gson. Creé la clase GsonJsonConverterImplementation<T>
. Esta clase tiene el siguiente método:Usando un tipo genérico con Gson
public T deserialize(String jsonString) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("MM/dd/yy HH:mm:ss");
Gson gson = builder.create();
return gson.fromJson(jsonString, T); // T.class etc. what goes here
}
El objetivo es que este método debe ser capaz de trabajar con cualquier tipo que he puesto mi GsonJsonConverterImplementation a trabajar. Desafortunadamente, gson.fromJson(jsonString, T)
no funciona, ni tampoco usa T.class
en lugar de T. Estoy seguro de que el problema se debe a mi falta de comprensión de los tipos genéricos de Java. ¿Cuál es la forma correcta de usar un genérico con Gson?
Editar
Usando Kris's answer yo supongo que esto debería funcionar. Desafortunadamente, clazz no se puede usar de esta manera y causa un error de compilación. ¿Cuáles son mis opciones para trabajar con una colección y un tipo genérico con Gson?
public List<T> deserializeList(String jsonString, Class<T> clazz) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("MM/dd/yy HH:mm:ss");
Gson gson = builder.create();
Type listType = new TypeToken<clazz>(){}.getType(); // compiler error
return gson.fromJson(jsonString, listType);
}
No sé si se puede hacer esto (Lista- es ok) trabajar con Gson, ya que TypeToken sigue siendo esencialmente una c estática onstruct (que es por qué tu código no puede funcionar). Pero si no tiene que usar absolutamente Gson, Jackson admite la creación programática de tipos (a través de métodos TypeFactory) y permite lo que está tratando de lograr. –
StaxMan
Pregunta duplicada: http://stackoverflow.com/questions/4226738/using-generics-with-gson?rq=1 –