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进行修改。


分享到:


相關文章: