你需要编写一个自定义反序列化器。我会像这样做:
首先,你需要包含一个新的类,不同于你已有的两个类:
public class Response {
public VkAudioAlbumsResponse response;
}
然后你需要一个自定义反序列化器,类似于这样:
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);
VkAudioAlbumsResponse vkAudioAlbumsResponse = new VkAudioAlbumsResponse();
for (int i=1; i<jArray.size(); i++) {
JsonObject jObject = (JsonObject) jArray.get(i);
VkAudioAlbum album = new VkAudioAlbum(jObject.get("owner_id").getAsInt(),
jObject.get("album_id").getAsInt(),
jObject.get("title").getAsString());
vkAudioAlbumsResponse.getResponse().add(album);
}
return vkAudioAlbumsResponse;
}
}
然后你需要像这样反序列化你的JSON:
GsonBuilder gsonBuilder = new GsonBuilder()
gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer())
Gson gson = gsonBuilder.create()
Response response = gson.fromJson(jsonString, Response.class)
使用这种方法时,当Gson尝试将JSON反序列化成Response
类时,它发现该类中有一个匹配JSON响应中名称的属性response
,因此它继续解析。
然后它意识到这个属性是VkAudioAlbumsResponse
类型的,所以它使用您创建的自定义反序列化器来解析它,该解析器处理JSON响应的剩余部分并返回一个VkAudioAlbumsResponse
对象。
注意:反序列化器中的代码非常简单,所以我想你不会有理解它的问题...更多信息请参见Gson API Javadoc