1. 程式人生 > >Json解析通用基類設計及設計思路

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。

那麼我們如何設計,

先分析一下我們的需求:

  1. 我們想要JSON基礎的結構也只對應一個物件。方便維護。
  2. 同時滿足不同的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]