Java基础--Android中泛型的应用(二)
来源:互联网 发布:手机自动优化软件 编辑:程序博客网 时间:2024/06/10 13:07
背景
感谢并参考[怪盗kidou]的《搞定Gson泛型封装》 。
上一篇《 Java基础–Android中泛型的应用(一)》介绍了泛型在Android开发中解析服务端回来json数据的使用,减少了许多冗余代码,但我们仍然不知道如何把泛型的类型传入给Gson的fromJson
方法里面,下面我们来看看:
想办法获取泛型类型
Gson为我们提供的TypeToken类,可以用于获取泛型类的类型:
Gson gson=new GsonBuilder().serializeNulls().create();BaseEntity<LoginEntity> entity = gson.fromJson(response, new TypeToken<BaseEntity<LoginEntity>>() {}.getType());
对于List是这么解析的:
Gson gson=new GsonBuilder().serializeNulls().create();BaseEntity<ListEntity<GoodsItem>> entity=gson.fromJson(response, new TypeToken<BaseEntity<ListEntity<GoodsItem>>>() {}.getType());
非常开心得知以上解析是可行的,但还不够好,需要进一步封装。于是我们将该解析方法统一封装为以下方法:
public <T> BaseEntity<T> fromJsonObject(String jsonStr, Class<T> clazz) { Type type = new TypeToken<BaseEntity<T>>(){}.getType(); return mGson.fromJson(jsonStr, type);}
但发现出错了,原来这里的TypeToken并不会对T进行解析,解析出来的结果只会是BaseEntity<T>
前面我们都是直接使用LoginEntity
,所以没有发现这个问题,参考《搞定Gson泛型封装》 ,我们最后只能使用ParameterizedType接口,如下:
public class ParameterizedTypeImpl implements ParameterizedType { private final Class raw; private final Type[] args; public ParameterizedTypeImpl(Class raw, Type[] args) { this.raw = raw; this.args = args != null ? args : new Type[0]; } @Override public Type[] getActualTypeArguments() { return args; } @Override public Type getRawType() { return raw; } @Override public Type getOwnerType() { return null; }}
对Gson的封装
我们定义了一个GsonHelper单例类,以方便各种同一的操作:
/** * Created by fangzhengyou on 16/9/23. * json数据统一在这里做解析 */public class GsonHelper { private static GsonHelper instance = null; private static final Object mLock = new Object(); private static Gson mGson = null; public static GsonHelper getInstance() { synchronized (mLock) { if (instance == null) { instance=new GsonHelper(); mGson = new GsonBuilder().serializeNulls().create(); } return instance; } } private GsonHelper() { } // 处理 data 为 null 的情况 public Result fromJsonNull(String jsonString, Class<BaseEntity> clazz) { return mGson.fromJson(jsonString, clazz); } // 处理 data 为 object 的情况 public <T> BaseEntity<T> fromJsonObject(String jsonStr, Class<T> clazz) { Type type = new ParameterizedTypeImpl(BaseEntity.class, new Class[]{clazz}); return mGson.fromJson(jsonStr, type); } // 处理 data 为 array 的情况 public <T> BaseEntity<ListEntity<T>> fromJsonArray(String jsonStr, Class<T> clazz){ // 生成ListEntity<T> 中的 Type Type listType = new ParameterizedTypeImpl(ListEntity.class, new Class[]{clazz}); // 根据ListEntity<T>生成的,再生出完整的BaseEntity<ListEntity<T>> Type type = new ParameterizedTypeImpl(BaseEntity.class, new Type[]{listType}); return mGson.fromJson(jsonStr, type); }}
那么以后我们要解析只需要按照原来的格式即可:
BaseEntity<ListEntity<GoodsItem>> entity = mGsonHelper.fromJsonArray(response,GoodsItem.class);
0 0
- Java基础--Android中泛型的应用(二)
- Java基础--Android中泛型的应用(一)
- java的基础(二)
- Java基础05(补充二)-异或的应用
- java开发Android应用后台(基础)
- java基础之抽象类与接口的应用(二)
- Android:基础认识(二)——四大应用组件
- Java基础之反射(二):反射应用
- android基础篇------------java基础(3) (数组和String的应用)
- Android学习-JAVA基础 (二)
- Android基础(二)
- Android基础(二)
- java反射技术的应用(二)
- Java的语言基础(二)
- java的一些语法基础(二)
- Java语言的基础语法(二)
- java基础的核心技术:多线程(二)
- Java重要的基础语法(二)
- 模板方法模式设计答题问题
- Spring中使用ApplicationContext进行事件的监听之ApplicationEvent,ApplicationListener
- scope参数错误或没有scope权限解决方法
- 2074--叠框,2091空心三角形
- JSP -- EL表达式
- Java基础--Android中泛型的应用(二)
- Producer-Consumer模型:一、简介
- 368. Largest Divisible Subset
- java的jre和jdk的安装和配置很容易
- Tree Traversals Again (PAT) - 树的遍历问题 (网络搜集的代码;注释为自己添加)
- Java8 - IdentityHashMap源码
- 洛谷 2331
- ZooKeeper集群安装
- 矩阵在CSS3 3D旋转和2D旋转上的应用