Android 接口解析容錯技術方案思考

Android 接口解析容錯技術方案思考

1、我們的目標期望

屏蔽掉因接口返回的數據錯誤而導致的app出現空指針和類型解析等異常。

2、技術方案思考

不管是空指針異常還是類型轉換異常,都不是出現在接口返回json的解析階段,而是出現在使用json轉換後的bean階段。因此我們要儘量避免這兩種異常,要麼在使用的時候加以限制,要麼在源頭加以處理。在使用的地方加以限制,這個非常難把控,因為這個bean使用的地方是難以預料和控制的;在源頭加以限制,這個只能是在bean本身和在json串轉成bean對象的階段。

2.1、針對空指針的方案

一、針對bean對象的get方法,對返回的字段的進行判空和賦值操作。

a、我們定義的bean對象的屬性字段均為private類型,在get調用的時候判斷該字段是否為null,是null則進行賦值操作,保證get方法一定不會返回null。(這個操作只針對非基本類型)

二、針對自動生成parser方法的解析器。

a、解析時以bean對象的字段為基準挨個檢索json數據進行賦值,使用JSONObject的opt相關方法,即使取不到該字段也會進行初始化賦值。

b、在對bean對象的處理上,如果獲取不到此bean對象的JSONObject,則會創建一個empty的JSONObject,然後用opt相關方法對該bean對象賦值。

c、對於list等數據的解析會先new一個empty的list賦值,然後遍歷jsonarray向list中插入值。

當我們按上面的規則進行bean的解析和生成的時候,大家注意這個bean對象的get返回的字段一定不會存在null,所以之前的一些邏輯如 if(bean.data == null){//dosomething} 需要重新考慮。

2.2、針對類型轉換異常的方案

我們常見的類型轉換異常就是在將一個非數字的字符串強轉成int和long等數字類型字段的時候出現的。

個人認為此異常的屏蔽不會出現在json解析成bean的階段,而應在bean的定義上去處理。json解析成bean的過程中,bean中需要的是string則直接使用JSONObject getString或者 optString,bean中需要的是int則直接使用JSONObject getInt或者 optInt方法,而這幾個方法都會拋出異常並且在解析階段就會捕獲(拋出異常不是RuntimeException子類)。

那麼如何在bean的定義上去處理這種類型轉換異常呢?目前採取如下策略:

一、將value是int串的string類型強制定義成int。目前判斷value的條件如下:"^[-\\+]?([1-9][0-9]{0,7})|0$",value滿足此條件的string會強制定義成int類型。

二、在bean中對value是數字串的string類型的字段,除生成其對應的返回string的get方法外,還同時生成其對應的返回int、long、float、double的方法。目前判斷value的條件如下:^[-\\+]?(\\d+(\\.\\d*)?|\\.\\d+)(f|F|D|d)?$"

因此如果明確想保留string類型的,需要在生成bean前對原json串中的value進行修改。


分享到:


相關文章: