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...