Gson反序列化 int型別變double型別

2021-10-10 10:47:18 字數 2738 閱讀 2747

經網上資料查詢,序列化的邏輯在 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 ...