nik*_*kin 13 java parsing json gson
我使用Gson解析JSON响应时遇到问题.
JSON字符串:
response: [
2, {
owner_id: 23972237,
album_id: 25487692,
title: 'album not new'
}, {
owner_id: 23972237,
album_id: 25486631,
title: '???'
}
]
Run Code Online (Sandbox Code Playgroud)
我有这两个班:
public class VkAudioAlbumsResponse {
public ArrayList<VkAudioAlbum> response;
public VkError error;
}
public class VkAudioAlbum {
public int owner_id;
public int album_id;
public String title;
}
Run Code Online (Sandbox Code Playgroud)
但是在使用Gson解析时我有一个异常.我知道这是因为响应数组的第一个元素不是一个对象,而是整数.
所以问题是,我能以某种方式解决它吗?
Mik*_*ikO 31
您必须编写自定义反序列化程序.我会做这样的事情:
首先,您需要包含一个新类,而不是您已有的2个类:
public class Response {
public VkAudioAlbumsResponse response;
}
Run Code Online (Sandbox Code Playgroud)
然后你需要一个自定义的反序列化器,类似于:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你必须反序列化你的JSON,如:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer());
Gson gson = gsonBuilder.create();
Response response = gson.fromJson(jsonString, Response.class);
Run Code Online (Sandbox Code Playgroud)
使用这种方法,当Gson尝试将JSON反序列化为Response类时,它会发现该类中有一个response与JSON响应中的名称匹配的属性,因此它会继续解析.
然后它意识到这个属性是类型的VkAudioAlbumsResponse,所以它使用你创建的自定义反序列化器来解析它,它处理JSON响应的剩余部分并返回一个对象VkAudioAlbumsResponse.
注意:反序列化器中的代码非常简单,所以我猜你理解它没有问题...有关详细信息,请参阅Gson API Javadoc
| 归档时间: |
|
| 查看次数: |
23558 次 |
| 最近记录: |