美文网首页
Gson 泛型封装model

Gson 泛型封装model

作者: poweru | 来源:发表于2017-03-31 10:46 被阅读0次

在项目开发中和服务端使用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各自的命名习惯。

相关文章

  • Gson 泛型封装model

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

  • Android中泛型的应用(二)

    背景感谢并参考[怪盗kidou]的《搞定Gson泛型封装》 。上一篇《 Java基础--Android中泛型的应用...

  • 搞定Gson泛型封装

    作者: @怪盗kidou 如需转载需在明显位置保留作者信息及原文链接如果博客中有不恰当之处欢迎留言交流http...

  • 遍历系统目录,以JSON格式响应请求

    由于用到gson,需要导入gson库。首先封装model类: importjava.util.List; publ...

  • 【已解决】Swift的泛型该如何初始化?

    Swift的泛型该如何初始化? 昨天准备封装一个请求类的时候,对于返回的Model使用了泛型。 但是在泛型初始化的...

  • Gson解析Json数组遇到的泛型类型擦除问题

    今天,我本来想对Gson做一个小小封装的,但却遇到了 Gson解析Json数组遇到的泛型类型擦除问题,下面对此做下...

  • Gson解析泛型

    做网络请求的时候肯定要封装回调,我这里就传了泛型,但是出了个问题是Gson没办法直接解析泛型,如果直接解析的话,不...

  • 混淆后json解析出错

    开启混淆后打包,程序出现json解析出错 原因:没有配置忽略要解析的model。(已经配置了gson忽略文件和泛型...

  • Android Gson 解析泛型报错

    当用Gson解析泛型会报以下错误: com.google.gson.internal.LinkedTreeMap ...

  • Gson泛型

    一、为何封装,如何封装 通常我们解析的json格式为 第一种的对应的Java类型为 Result ,第二...

网友评论

      本文标题:Gson 泛型封装model

      本文链接:https://www.haomeiwen.com/subject/acymottx.html