在與后臺(tái)數(shù)據(jù)交互中,總會(huì)遇到一些后臺(tái)返回的臟數(shù)據(jù),從而在用GsonFormat生成對(duì)象時(shí)報(bào)錯(cuò)。有數(shù)據(jù)時(shí)本來字段是一個(gè)對(duì)象,沒數(shù)據(jù)時(shí)后臺(tái)PHP返回的這個(gè)字段為“”,從而導(dǎo)致了數(shù)據(jù)解析錯(cuò)誤,從而導(dǎo)致了異常。下面代碼以此記錄:
/**
* Gson解析工具類
* @param <T>
*/
public class GsonUtils<T> {
/** GsonUtils 單實(shí)例 */
private static GsonUtils mGsonUtils = null;
private GsonUtils(){ }
/**
* 單例初始化對(duì)象
**/
public static GsonUtils getInstance(){
if(mGsonUtils == null){
synchronized (GsonUtils.class){
if(mGsonUtils ==null) {
mGsonUtils = new GsonUtils();
}
}
}
return mGsonUtils;
}
/**
* 獲取過濾對(duì)象的json數(shù)據(jù)
* @param baseType 對(duì)象類資源
* @param nullObj 空的對(duì)象數(shù)據(jù)
* @return
*/
public Gson getObjectJson(Class<?>[] baseType, Object[] nullObj ){
if(baseType == null || nullObj == null){
return new Gson();
}
GsonBuilder gsonBuilder = new GsonBuilder();
//循環(huán)添加過濾條件
for (int i = 0; i < nullObj.length; i++) {
addRegister(baseType[i],nullObj[i],gsonBuilder);
}
return gsonBuilder.create();
}
/**
* 添加過濾適配
* @param baseType
* @param nullObj
* @param gsonBuilder
* @return
*/
private GsonBuilder addRegister(Class<?> baseType, final Object nullObj, GsonBuilder gsonBuilder){
gsonBuilder.registerTypeHierarchyAdapter(baseType, new JsonDeserializer<T>() {
@Override
public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if(json.isJsonObject()){//是對(duì)象
Gson newGson = new Gson();
return newGson.fromJson(json,typeOfT);
}else {//不是對(duì)象,返回空對(duì)象
return (T) nullObj;
}
}
});
return gsonBuilder;
}
}
調(diào)用:
//解析數(shù)據(jù)
Class<?>[] baseType = new Class[]{類.class,類.class,類.class};
Object[] objects = new Object[]{new 類(),new 類(),new 類()};
Gson gson = GsonUtils.getInstance().getObjectJson(baseType,objects);
運(yùn)用Gson容錯(cuò)機(jī)制,對(duì)此字段進(jìn)行序列化判斷,從而達(dá)到目的。