gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:08 27 4
gpt4 key购买 nike

我在使用 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 解析它时出现异常。我知道这是因为响应数组的第一个元素不是对象,而是整数。

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

最佳答案

你必须写一个 custom deserializer .我会做这样的事情:

首先,您需要包含一个新类,而不是您已有的 2 个类:

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 API Javadoc

关于java - 使用 Gson 的自定义 JSON 反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16590377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com