Deserializzatore JSON personalizzato usando Gson

Ho un problema con l’analisi di una risposta JSON usando Gson.

Stringa JSON:

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

Ho queste 2 classi:

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

Ma ho un’eccezione quando analizzo questo usando Gson. So che questo è dovuto al fatto che il primo elemento dell’array response non è un object, ma un intero.

Quindi la domanda è, posso risolverlo in qualche modo?

Devi scrivere un deserializzatore personalizzato . Farei qualcosa di simile a questo:

Per prima cosa devi includere una nuova class, oltre alla 2 che hai già:

 public class Response { public VkAudioAlbumsResponse response; } 

E poi hai bisogno di un deserializzatore personalizzato, qualcosa di simile a questo:

 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 

Quindi devi deserializzare il tuo JSON come:

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

Con questo approccio, quando Gson tenta di deserializzare il JSON nella class Response , trova che c'è una response attributo in quella class che corrisponde al nome nella risposta JSON, quindi continua l'analisi.

Quindi si rende conto che questo attributo è di tipo VkAudioAlbumsResponse , quindi usa il deserializzatore personalizzato che hai creato per analizzarlo, che elabora la parte rimanente della risposta JSON e restituisce un object di VkAudioAlbumsResponse .

Nota: il codice nel deserializzatore è abbastanza semplice, quindi suppongo che non avrai problemi a capirlo ... Per ulteriori informazioni vedi Gson API Javadoc