背景
感謝并參考[怪盜kidou]的《搞定Gson泛型封裝》 。
上一篇《 Java基礎(chǔ)--Android中泛型的應(yīng)用(一)》介紹了泛型在A(yíng)ndroid開(kāi)發(fā)中解析服務(wù)端回來(lái)json數(shù)據(jù)的使用,減少了許多冗余代碼,但我們?nèi)匀徊恢廊绾伟逊盒偷念?lèi)型傳入給Gson的fromJson方法里面,下面我們來(lái)看看:
想辦法獲取泛型類(lèi)型
Gson為我們提供的TypeToken類(lèi),可以用于獲取泛型類(lèi)的類(lèi)型:
Gson gson=new GsonBuilder().serializeNulls().create();
BaseEntity<LoginEntity> entity = gson.fromJson(response, new TypeToken<BaseEntity<LoginEntity>>() {}.getType());
對(duì)于List是這么解析的:
Gson gson=new GsonBuilder().serializeNulls().create();
BaseEntity<ListEntity<GoodsItem>> entity=gson.fromJson(response, new TypeToken<BaseEntity<ListEntity<GoodsItem>>>() {}.getType());
非常開(kāi)心得知以上解析是可行的,但還不夠好,需要進(jìn)一步封裝。于是我們將該解析方法統(tǒng)一封裝為以下方法:
public <T> BaseEntity<T> fromJsonObject(String jsonStr, Class<T> clazz) {
Type type = new TypeToken<BaseEntity<T>>(){}.getType();
return mGson.fromJson(jsonStr, type);
}
但發(fā)現(xiàn)出錯(cuò)了,原來(lái)這里的TypeToken并不會(huì)對(duì)T進(jìn)行解析,解析出來(lái)的結(jié)果只會(huì)是BaseEntity<T>
前面我們都是直接使用LoginEntity,所以沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題,參考《搞定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;
}
}
對(duì)Gson的封裝
我們定義了一個(gè)GsonHelper單例類(lèi),以方便各種同一的操作:
/**
* Created by fangzhengyou on 16/9/23.
* json數(shù)據(jù)統(tǒng)一在這里做解析
*/
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});
// 根據(jù)ListEntity<T>生成的,再生出完整的BaseEntity<ListEntity<T>>
Type type = new ParameterizedTypeImpl(BaseEntity.class, new Type[]{listType});
return mGson.fromJson(jsonStr, type);
}
}
那么以后我們要解析只需要按照原來(lái)的格式即可:
BaseEntity<ListEntity<GoodsItem>> entity = mGsonHelper.fromJsonArray(response,GoodsItem.class);