使用Gson的自定义JSON解串器

我有使用GsonparsingJSON响应的问题。

JSONstring:

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

我有这两个类:

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

但是,当使用Gsonparsing这个时,我有一个exception。 我知道这是因为响应数组的第一个元素不是一个对象,而是整数。

所以问题是,我能以某种方式解决吗?

你必须写一个自定义的解串器 。 我会做这样的事情:

首先,你需要包括一个新的课程,比你已经拥有的课程还要多:

 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); //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; } } 

那么你必须反序列化你的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响应中的名称匹配的属性响应,所以它继续parsing。

然后它意识到这个属性是VkAudioAlbumsResponsetypes的,所以它使用你创build的自定义解串器来parsing它,它处理JSON响应的剩余部分并返回一个VkAudioAlbumsResponse对象。

注意:进入反序列化器的代码非常简单,所以我想你不需要理解它。有关更多信息,请参阅Gson API Javadoc