Gson自定義介面卡處理特殊解析異常

2021-08-21 20:56:15 字數 3306 閱讀 1194

1、本來解析字串 「24」 轉成int 的24,但如果有些情況下給你返了個空字串,實際上我們需要把空字串轉成乙個固定的值-1 

2、本來是解析乙個物件,但是後台直接傳回來乙個null(這表示整個物件是null,正常一般後台會new乙個空物件給你) 

3、伺服器返回的資料中data欄位型別不固定,比如請求成功data是乙個list,不成功的時候是string型別,這樣前端在使用泛型解析的時候

gson2.0開始提供的抽象類,兩個主要的方法

public abstract class typeadapter
一般與gsonbuilder.registertypeadapter 示或gsonbuilder.registertypehierarchyadapter配合使用

使用例項:

user user = new user("張三", 20);

user.idnum = "342401199108165674";

gson gson = new gsonbuilder()

//為user註冊typeadapter

.registertypeadapter(user.class, new usertypeadapter())

.create();

system.out.println(gson.tojson(user));

public class usertypeadapter extends typeadapter

@override

public user read(jsonreader in) throws ioexception

}in.endobject();

return user;

}}

注意:用過自定義介面卡之後,註解就失效了比如:@serializedname

針對問題一:

gson gson = new gsonbuilder()

.registertypeadapter(integer.class, new typeadapter()

@override

public integer read(jsonreader in) throws ioexception catch (numberformatexception e) }})

.create();

jsonserializer(序列化,其實就是tojson)與jsondeserializer(反序列化,其實就是轉化為物件),把typeadapter的功能細化

序列化:

jsonserializernumberjsonserializer = new jsonserializer() 

};gson gson = new gsonbuilder()

.registertypeadapter(integer.class, numberjsonserializer)

反序列化:

gson gson = new gsonbuilder()

.registertypeadapter(integer.class, new jsondeserializer() catch (numberformatexception e) }})

.create();

registertypeadapter支援泛型,registertypehierarchyadapter支援繼承 

泛型:

type type = new typetoken>() {}.gettype();

typeadapter typeadapter = new typeadapter>() ;

gson gson = new gsonbuilder()

.registertypeadapter(type, typeadapter)

.create();

listlist = new arraylist<>();

list.add(new user("a",11));

list.add(new user("b",22));

繼承:

jsonserializernumberjsonserializer = new jsonserializer() 

};gson gson = new gsonbuilder().registertypehierarchyadapter(number.class, numberjsonserializer)

.create();

解決問題三: 

方法一:

gson gson = new gsonbuilder().registertypehierarchyadapter(list.class, new jsondeserializer>() else 

}}).create();

方法二:(效率高)

gson gson = new gsonbuilder().registertypehierarchyadapter(list.class, new jsondeserializer>() 

return list;

} else

}}).create();

callcall = api.getmatchcalendar(teamid, year, month);

call.enqueue(new retrofit2.callback() else

}@override

public void onfailure(callcall, throwable t)

});

public class jsonparser 

}

public class matchplayerinfodefaultadapter implements jsonserializer, jsondeserializer

} catch (exception ignore)

try catch (numberformatexception e)

}@override

public jsonelement serialize(matchplayerinfo src, type typeofsrc, jsonserializationcontext context) catch (illegalacces***ception e)

}return jsonobject;

}}

自定義介面卡

1 我們為什麼要用自定義介面卡?由於簡單的介面卡解析專案的能力有限,所以我們要用自定義介面卡 2 baseadapter 是所有介面卡類的父類,可以對列表項進行最大限度的定製 3 陣列介面卡跟簡單的介面卡解析都是直接new出來,eg 陣列介面卡 arrayadapter arrayadapter n...

自定義介面卡

自定義介面卡 加上mvc default servlet handler 否則找不到資源 mvc default servlet handler 的作用 優雅rest風格的資源url不希望帶 html 或 do 等字尾.由於早期的spring mvc不能很好地處理靜態資源,所以在web.xml中配置...

自定義介面卡getview方法

public view getview int position,view convertview,viewgroup parent else 取出bean物件 itembean bean mlist.get position 設定控制項的資料 viewholder.imageview.setima...