Json解析通用基類設計及設計思路
Json解析層級巢狀類設計
本篇小文的初衷:解決日常開發JSON解析類中擴充套件性、冗餘程式碼問題
日常開發中,在設計網路返回資料解析類(BaseNetBean)時,形如
{
"resultcode": "200",
"reason": "successed!",
"result": {},
"error_code": 0
}
public class BaseNetBean implements Serializable { private String resultcode; private String reason; //-------------------// //private Object result;// //-------------------// private int error_code; }
BaseNetBean中有一些自定義的協議code等,但是不同的result需要不同的物件,來解析Object型別的result
並且也會產生很多冗餘的程式碼。
例如:
result對應的Json需要一個PersonBean解析,其他介面,result對應的Json需要PersonBeanList解析。
這樣我們在設計類的時候就需要按照以下設計
public class BaseNetBean implements Serializable { private String resultcode; private String reason; private PersonBean result;// private int error_code; }
而對於PersonBeanList則需要如此設計
public class BaseNetBean implements Serializable {
private String resultcode;
private String reason;
private PersonBeanList<PersonBean> result;//
private int error_code;
}
如此設計產生的後果:
為了解析不同的資料,會產生更多的resultCode、reason、error_code。並且以後需要在BaseNetBean中新增一個欄位、刪除一個欄位、程式碼量將會是一場噩夢,擴充套件大大降低。
如此也能完成任務,但是維護起來會很費勁。你維護還是別人維護都會罵一句shit。
那麼我們如何設計,
先分析一下我們的需求:
- 我們想要JSON基礎的結構也只對應一個物件。方便維護。
- 同時滿足不同的result對應不同的物件,又能使用JSON解析庫解析
針對以上的需求,設計以下基類結構(全文重點必考):
public class BaseNetBean<T> implements Serializable {
/**
* resultcode : 200
* reason : 查詢成功!
* result : {}
* error_code : 0
*/
private String resultcode;
private String reason;
private T result;
private int error_code;
}
使用泛型傳入我們想要的不同result型別,形如:
PersonBean
fun getPerson(): Observable<BaseNetBean<PersonBean>>
PersonBeanList
fun getPersonBeanList(): Observable<BaseNetBean<PersonBeanList>>
按照上述設計,
基類中的結構對應JSON中基礎部分,基類的變化只需要修改一個類檔案,安全可靠。
傳入的泛型T對應result不同的物件型別,以此對應不同的業務邏輯。
為什麼採用泛型來解決
因為我們的痛點就在於變化的result型別無法在Base基類中獲取。
(使用第一種設計雖然滿足了在Base中聲m明不同的result型別,但擴充套件性極差)
結合泛型的特性,完全滿足上述需求,
解析過程
在使用Json解析庫時候,當讀取到泛型T所代表的的型別,解析庫直接使用泛型所代表的型別解析,解析過程與第一種設計完全一樣。
有問題,郵件我。
[email protected]