Android中泛型的應(yīng)用(二)

背景
感謝并參考[怪盜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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容