我在使用Gson解析JSON响应时遇到问题。
JSON字串:
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; }
但是当使用Gson解析这个时我有一个异常。我知道这是因为响应数组的第一个元素不是对象,而是整数。
所以问题是,我能以某种方式解决它吗?
您必须编写一个 自定义反序列化器 。我会做这样的事情:
首先,您需要包括一个新的类,而不是已有的两个类:
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类时,它将发现该类中存在一个response与JSON响应中的名称匹配的属性,因此它将继续进行解析。
Response
response
然后,它意识到此属性是类型的VkAudioAlbumsResponse,因此它将使用您创建的自定义反序列化器对其进行解析,该反序列化器将处理JSON响应的其余部分并返回对象VkAudioAlbumsResponse。
VkAudioAlbumsResponse
注意:反序列化器中的代码非常简单,因此我想您将毫无疑问地了解它…有关更多信息,请参见 Gson API Javadoc