經網上資料查詢,序列化的邏輯在 com.google.gson.internal.bind.objecttypeadapter 類中。
將原始碼拷貝出來,修改 number 處理邏輯。
@override
public object read
(jsonreader in)
throws ioexception
in.endarray()
;return list;
case begin_object:
mapmap =
newlinkedtreemap
(); in.
beginobject()
;while
(in.
hasnext()
) in.
endobject()
;return map;
case string:
return in.
nextstring()
;// 修改這裡的邏輯,避免int轉成double
case number:
string s = in.
nextstring()
;if(s.contains
("."))
else
catch
(exception e)
}case boolean:
return in.
nextboolean()
;case null:
in.nextnull()
;return null;
default
:throw
newillegalstateexception()
;}}
瀏覽gson原始碼,發現在建構函式中,gson會將 objecttypeadapter 新增到 factories集合中。
大體思路如下:
反射獲取到 factories 屬性。
獲取集合中 objecttypeadapter 的索引
將自定義後的 objecttypeadapter 覆蓋原有 objecttypeadapter
gson gson =
newgsonbuilder()
.create()
;// 獲取 factories 屬性
field declaredfield = gson.
class
.getdeclaredfield
("factories");
declaredfield.
setaccessible
(true);
object factories = declaredfield.
get(gson)
;// 瀏覽原始碼得知 factories 集合型別是 unmodifiablerandomaccesslist
// 該集合中有乙個list 屬性儲存了 typeadapter
class<
?>
declaredclasses = collections.
class
.getdeclaredclasses()
;// 迴圈從父類查詢
field listfield =
mydeclaredfield
(factories,
"list");
listfield.
setaccessible
(true);
// 獲取 typeadapter集合
list
list =
(list
) listfield.
get(factories)
;// 找到 objecttypeadapter 索引位置
int i1 = list.
indexof
(objecttypeadapter.factory)
;// 使用自定義 objecttypeadapter 將其替換
list.
set(i1, com.***.frame.util.gsonadapter.objecttypeadapter.factory)
;// 反射迴圈向上查詢類屬性
public
static field mydeclaredfield
(object object, string fieldname)
catch
(exception e)
clazz = clazz.
getsuperclass()
;}return null;
}
測試**public
static
void
main
(string[
] args)
throws exception "
; hashmap hashmap = gson.
fromjson
(a, hashmap.
class);
system.out.
println
(hashmap.
tostring()
);}
輸出結果
反射修改不可變集合unmodifiablelist
徹底解決 gson 將 int 轉換為 double 的問題
gson反序列化localdateTime格式
如果需要反序列化內容是 yyyy mm dd hh mm ss 格式 那麼使用網上搜出來的 gson gson new gsonbuilder registertypeadapter localdatetime.class,new jsondeserializer create 會報錯轉化錯誤。大概...
Gson 序列化物件和反序列化 例項
from 用到的類 class netnews public string getresult public void setresult string result public arraylistgetdata public void setdata arraylistdata public s...
C 匿名型別序列化 反序列化
現在提倡前後端分離,分離後服務全部採用介面的方式給前端提供服務,當我們處理自定義查詢時必定會多表查詢,而處理多表查詢時我們又懶的去建view model,建的過多專案也凌亂的很,所以在dao層處理自定義查詢時採用匿名型別返回json。listodata new list odata.add new ...