gson对象封装解析

gson解析给大家打开很多便利,封装起来也比较省事,简单的gson解析直接用class或者type解析出来就可以了。
不过一般的服务端返回用户对象封装好多会遇到各种问题各种坑

以下分析常用的gson解析服务器返回的通用方法:

1、客户端和服务器一般gson格式都会定义固定的格式方便接口统一处理
比如类似下边的格式,data可以是array 数组[],也可以是obj{}

{
    "code": "0000",
    "msg": "成功",
    "t": [{
        "userid": "1",
        "userName": "张三"
    }, {
        "userid": "1",
        "userName": "王五"
    }]
}
{
    "code": "0000",
    "msg": "成功",
    "data": {
        "userid": "1",
        "userName": "张三"
    }
}

2、解析这样的数据,一般大家都会把data 分开解析,如果是数组的话怎么解析,如果是对象的话怎么解析。具体这种解析可以看相关的文档。
分开解析可以满足需求,但是对于解析过程多了一步,先解析完成第一级才能判断是否数组,这样效率有所影响
3、其实可以利用泛型及泛型的的一个方法来获取解析的数据类型的
首先我们先一个基础对象封装类

abstract class  JsonModels<T>  {



    private String msg;
    private String code;
    private T data;

     
    public String getMsg() {
        return msg;
    }
    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

     
     
    
    
}

我们再根据下边的方法获取到t,t其实就是所传到对象的User或者是List<User>;

Type type = getClass().getGenericSuperclass();
Type[] t = ((ParameterizedType) type).getActualTypeArguments();

获取到t后我们怎么拼装成Type呢?查看源码发现Type有几个实现类我们用到ParameterizedType,然后继承这个类之后把jmodel和t设置进去就可以了

class ParameterizedTypeImpl implements ParameterizedType {
    Type[] type;
    Class raw;

    @Override
    public Type[] getActualTypeArguments() {
        // TODO 自动生成的方法存根
        return type;
    }

    @Override
    public Type getOwnerType() {
        // TODO 自动生成的方法存根
        return null;
    }

    public ParameterizedTypeImpl(Type[] args, Class raw) {
        super();
        this.type = args != null ? args : new Type[0];
        this.raw = raw;
    }

    @Override
    public Type getRawType() {
        // TODO 自动生成的方法存根
        return raw;
    }

我们可以直接把json解析放到JsonModel中去

public JsonModel<T> toJsonModel(String json) {
        Type type = getClass().getGenericSuperclass();
        Type[] t = ((ParameterizedType) type).getActualTypeArguments();
        Type ty = new ParameterizedTypeImpl(t, JsonModel.class);
        return new Gson().fromJson(json, ty );
    }

----注意这个方法getGenericSuperclass调用必须是JsonModels为抽象类,我们再写一个实现类,实现类可以为空什么也不写,如下:

class JsonModel<T> extends JsonModels<T>{}

现在基本类已经写完了,以下就是直接调用了。

    public static void main(String args[]) {
//      String json="{\"code\":\"0000\",\"msg\":\"成功\",\"data\":[{\"userid\":\"1\",\"userName\":\"张三\"},{\"userid\":\"1\",\"userName\":\"王五\"}]}";
        String json="{\"code\":\"0000\",\"msg\":\"成功\",\"data\":{\"userid\":\"1\",\"userName\":\"张三\"}}";
        JsonModel<List<User>> j=new  JsonModel<List<User>>().toJsonModel(json);
        
        System.out.println(j.getData());
    }

调用的时候是不是很简单呢,基本的解析就到这里了,其实封装的关键主要是运用了如下几个特性
getGenericSuperclass,ParameterizedType

GitHub已经上传完整代码欢迎大家下载

https://github.com/wbsh583/gsonutl

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 1.概述2.Gson的目标3.Gson的性能和扩展性4.Gson的使用者5.如何使用Gson 通过Maven来使用...
    人失格阅读 14,196评论 2 18
  • JSON的特点: 1、JSON比XML的数据传递的有效性高;2、JSON完全独立于编程语言;3、JSON的本质是具...
    程序员之路阅读 3,476评论 0 3
  • 做网络请求的时候肯定要封装回调,我这里就传了泛型,但是出了个问题是Gson没办法直接解析泛型,如果直接解析的话,不...
    键盘上的麒麟臂阅读 32,367评论 9 26
  • 价格歧视的策略。 价格歧视其实非常有意义,能够促进生产,减少浪费,最大化增加消费者满足感的商业行为,但也是一种被深...
    瞰川阅读 383评论 0 0
  • 很小的时候,我就期盼着赶紧长大,长大了就可以像姐姐们一样玩耍,长大了就没有父母的唠叨,长大了就有了自由。 ...
    水筠心宁阅读 158评论 0 0