Gson 泛型封装model

在项目开发中和服务端使用json数据格式进行交互的时候,通常服务端返回的数据会约定一个数据格式,例如:


{"code":"0","message":"success","data":{}}

我们真正需要的data所包含的数据,而code只使用一次,message很少用到。如果Gson不支持泛型或不知道Gson支持泛型的一定会这么定义Model。

public class UserModel {

    public int code;
    public String message;
    public User data;

    public static class User {
        public int name;
        public int age;
        public int sex;
    }
}

当其它接口的时候又重新定义一个XXResponse将data的类型改成XX,很明显code,和message被重复定义了多次,通过泛型的话我们可以将code和message字段抽取到一个Result的类中,这样我们只需要编写data字段所对应的Model即可,更专注于我们的业务逻辑。如:

public class Result<T> {
    public int code;
    public String message;
    public T data;
}

到了这一步接下来肯定有些伙伴会这样写

public class UserModel extends Result<UserModel> {
    public int name;
    public int age;
    public int sex;
}
//解析的时候这样解析
//gson.fromJson(json, UserModel.class);

如果你信心满满的按照上面这种写法的话发现解析出来的UserModel对象里面的属性都没有值,如果你调试的话就会发现UserModel 中的data 字段是有值的。

正确的做法:

public class UserModel {
    public int name;
    public int age;
    public int sex;
}
//解析的时候这样解析
//gson.fromJson(json, new TypeToken<Result<UserModel>>(){}.getType());

泛型封装统一的Model就讲到这了,Gson框架其实是很强大的,在这里再介绍一个开发中可能碰到的关于JSON解析的问题。

有次我们服务端的人员很操蛋的将一个字段的Key定义为了short,当我封装model模型的时候懵逼了,what?不带这样玩的。当然你可以很理直气壮的让服务端的开发人员将字段改一下,但万一此接口还有其他的平台使用,比如PHP,你这样要求别人改那PHP的哥们已经写好了可能就不乐意了,那我们有没有什么办法自己解决这个问题呢?当然利用Gson是可以实现的。
我们知道Gson在序列化和反序列化时需要使用反射,说到反射就不得不想到注解,一般各类库都将注解放到annotations包下,打开源码在com.google.gson包下果然有一个annotations,里面有一个SerializedName的注解类,这应该就是我们要找的。
那么对于json中short这个属性我们可以这样定义:

@SerializedName("short")
public String mshort;

这样的话,很好的保留了前端、后台、Android/java各自的命名习惯。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 166,767评论 24 703
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 131,235评论 18 138
  • 转载:http://www.jianshu.com/p/e740196225a4本文为作者根据日常使用结合Gson...
    朝花夕拾不起来阅读 729评论 0 1
  • 2017-07-29 周六 闰六月初七 感赏今天顺利的写完这个月亲子群的晨享日志,写完之后,令我的心情感觉到超级的...
    代灿红_六中阅读 120评论 0 0
  • 小的时候,我们家的孩子就是别人爸妈口中里的别人家的孩子。从小见到邻居亲戚都会夸我们家的孩子懂事,我也感觉自己很懂事...
    72f0392bffcf阅读 126评论 0 0