Deserializador personalizado JSON con Gson

Tengo un problema al analizar una respuesta JSON usando Gson.

Cadena JSON:

response: [ 2, { owner_id: 23972237, album_id: 25487692, title: 'album not new' }, { owner_id: 23972237, album_id: 25486631, title: 'фыв' } ] 

Tengo estas 2 clases:

 public class VkAudioAlbumsResponse { public ArrayList response; public VkError error; } public class VkAudioAlbum { public int owner_id; public int album_id; public String title; } 

Pero tengo una excepción al analizar esto usando Gson. Sé que esto se debe a que el primer elemento del conjunto de respuestas no es un objeto, sino un número entero.

Entonces la pregunta es, ¿puedo resolverlo de alguna manera?

Tienes que escribir un deserializador personalizado . Haría algo como esto:

Primero necesita incluir una nueva clase, más allá de las 2 que ya tiene:

 public class Response { public VkAudioAlbumsResponse response; } 

Y luego necesita un deserializador personalizado, algo similar a esto:

 private class VkAudioAlbumsResponseDeserializer implements JsonDeserializer { @Override public VkAudioAlbumsResponse deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { JsonArray jArray = (JsonArray) json; int firstInteger = jArray.get(0); //ignore the 1st int VkAudioAlbumsResponse vkAudioAlbumsResponse = new VkAudioAlbumsResponse(); for (int i=1; i 

Entonces debes deserializar tu JSON como:

 GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer()); Gson gson = gsonBuilder.create(); Response response = gson.fromJson(jsonString, Response.class); 

Con este enfoque, cuando Gson intenta deserializar el JSON en la clase Response , descubre que hay una response atributo en esa clase que coincide con el nombre en la respuesta JSON, por lo que continúa el análisis.

Luego se da cuenta de que este atributo es de tipo VkAudioAlbumsResponse , por lo que utiliza el deserializador personalizado que ha creado para analizarlo, que procesa la parte restante de la respuesta JSON y devuelve un objeto de VkAudioAlbumsResponse .

Nota: El código en el deserializador es bastante sencillo, así que supongo que no tendrá problemas para entenderlo ... Para más información, consulte API Javadoc de Gson