使用Gson的自定义JSON反序列化器

我在使用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响应中的名称匹配的属性,因此它将继续进行解析。

然后,它意识到此属性是类型的VkAudioAlbumsResponse,因此它将使用你创建的自定义反序列化器来解析该属性,该反序列化器将处理JSON响应的其余部分并返回对象VkAudioAlbumsResponse

以上是 使用Gson的自定义JSON反序列化器 的全部内容, 来源链接: utcz.com/qa/428262.html

回到顶部