Posteriormente a investigar con especialistas en este tema, programadores de deferentes áreas y profesores dimos con la solución al problema y la compartimos en este post.
Solución:
Aquí tienes:
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
Type type = new TypeToken
Este código funciona:
Gson gson = new Gson();
String json = ""k1":"v1","k2":"v2"";
Map map = new HashMap();
map = (Map) gson.fromJson(json, map.getClass());
Sé que esta es una pregunta bastante antigua, pero estaba buscando una solución para deserializar genéricamente JSON anidado a un Map
y no encontré nada.
La forma en que funciona mi deserializador yaml, por defecto los objetos JSON son Map
cuando no especifica un tipo, pero gson no parece hacer esto. Afortunadamente, puede lograrlo con un deserializador personalizado.
Usé el siguiente deserializador para deserializar naturalmente cualquier cosa, por defecto JsonObject
s a Map
y JsonArray
s a Object[]
s, donde todos los elementos secundarios se deserializan de manera similar.
private static class NaturalDeserializer implements JsonDeserializer
El desorden dentro de la handlePrimitive
El método es para asegurarse de que solo obtenga un Doble o un Entero o un Largo, y probablemente podría ser mejor, o al menos simplificado si está de acuerdo con obtener BigDecimals, que creo que es el valor predeterminado.
Puede registrar este adaptador como:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
Gson gson = gsonBuilder.create();
Y luego llámalo como:
Object natural = gson.fromJson(source, Object.class);
No estoy seguro de por qué este no es el comportamiento predeterminado en gson, ya que está en la mayoría de las otras bibliotecas de serialización semiestructuradas…
Reseñas y valoraciones
Agradecemos que quieras añadir valor a nuestro contenido añadiendo tu veteranía en las interpretaciones.