为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2019-10-21 12:48:46
我在使用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解析这个时我有一个异常。我知道这是因为响应数组的第一个元素不是对象,而是整数。所以问题是,我能以某种方式解决它吗?
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您必须编写一个自定义反序列化器。我会做这样的事情:


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


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


查看完整回答
反对 回复 2019-10-21
  • 1 回答
  • 0 关注
  • 351 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信