Devi scrivere un custom deserializer. Mi piacerebbe fare qualcosa di simile:
In primo luogo è necessario includere una nuova classe, oltre il 2 avete già:
public class Response {
public VkAudioAlbumsResponse response;
}
E poi avete bisogno di un deserializzatore personalizzato, qualcosa di simile a questo:
private class VkAudioAlbumsResponseDeserializer
implements JsonDeserializer<VkAudioAlbumsResponse> {
@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<jArray.size(); i++) {
JsonObject jObject = (JsonObject) jArray.get(i);
//assuming you have the suitable constructor...
VkAudioAlbum album = new VkAudioAlbum(jObject.get("owner_id").getAsInt(),
jObject.get("album_id").getAsInt(),
jObject.get("title").getAsString());
vkAudioAlbumsResponse.getResponse().add(album);
}
return vkAudioAlbumsResponse;
}
}
Poi si deve deserializzare vostro JSON come:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer());
Gson gson = gsonBuilder.create();
Response response = gson.fromJson(jsonString, Response.class);
Con questa appr oach, quando Gson prova a deserializzare il JSON nella classe Response
, trova che c'è un attributo response
in quella classe che corrisponde al nome nella risposta JSON, quindi continua l'analisi.
Quindi questo attributo è di tipo VkAudioAlbumsResponse
, quindi utilizza il deserializzatore personalizzato che è stato creato per analizzarlo, che elabora la parte rimanente della risposta JSON e restituisce un oggetto di VkAudioAlbumsResponse
.
Nota: Il codice nel deserializzatore è abbastanza semplice, quindi credo che non avrete alcun problema a capirlo ... Per ulteriori informazioni visita Gson API Javadoc
Grande risposta, anche se io preferisco creare un metodo privato invece di creare una nuova classe;) –
@MattiaRuggiero Preferisco di gran lunga una classe separata con quella specifica responsabilità: avere un sacco di classi piccole è sempre una buona idea, a patto che le organizziate chiaramente ... – MikO