在与后台数据交互中,总会遇到一些后台返回的脏数据,从而在用GsonFormat生成对象时报错。有数据时本来字段是一个对象,没数据时后台PHP返回的这个字段为“”,从而导致了数据解析错误,从而导致了异常。下面代码以此记录:
/**
* Gson解析工具类
* @param
*/
public class GsonUtils {
/** GsonUtils 单实例 */
private static GsonUtils mGsonUtils = null;
private GsonUtils(){ }
/**
* 单例初始化对象
**/
public static GsonUtils getInstance(){
if(mGsonUtils == null){
synchronized (GsonUtils.class){
if(mGsonUtils ==null) {
mGsonUtils = new GsonUtils();
}
}
}
return mGsonUtils;
}
/**
* 获取过滤对象的json数据
* @param baseType 对象类资源
* @param nullObj 空的对象数据
* @return
*/
public Gson getObjectJson(Class>[] baseType, Object[] nullObj ){
if(baseType == null || nullObj == null){
return new Gson();
}
GsonBuilder gsonBuilder = new GsonBuilder();
//循环添加过滤条件
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() {
@Override
public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if(json.isJsonObject()){//是对象
Gson newGson = new Gson();
return newGson.fromJson(json,typeOfT);
}else {//不是对象,返回空对象
return (T) nullObj;
}
}
});
return gsonBuilder;
}
}
调用:
//解析数据
Class>[] baseType = new Class[]{类.class,类.class,类.class};
Object[] objects = new Object[]{new 类(),new 类(),new 类()};
Gson gson = GsonUtils.getInstance().getObjectJson(baseType,objects);
运用Gson容错机制,对此字段进行序列化判断,从而达到目的。