Gson轉換導致int轉為double問題解決

2021-10-01 19:38:05 字數 3605 閱讀 2026

當我們用object或者map中的泛型使用了object,我們將json轉換之後,發現資料中的所以數值都變成了double型別,0變為了0.0,導致後續程式可能出現一些問題。

檢視gson的原始碼, 會發現object最後預設的typeadapter使用的是com.google.gson.internal.bind包下的objecttypeadapter,裡邊的處理如下:

/**

* adapts types whose static type is only 'object'. uses getclass() on

* serialization and a primitive/map/list on deserialization.

*/public

final

class

objecttypeadapter

extends

typeadapter

<

object

>

return

null;}

};private

final

gson gson;

objecttypeadapter

(gson gson)

@override

public

object

read

(jsonreader in)

throws

ioexception

in.endarray()

;return list;

case begin_object:

map<

string

,object

>

map =

newlinkedtreemap

<

string

,object

>()

; in.

beginobject()

;while

(in.

hasnext()

) in.

endobject()

;return map;

case string:

return in.

nextstring()

;case number:

return in.

nextdouble()

;case boolean:

return in.

nextboolean()

;case null:

in.nextnull()

;return

null

;default

:throw

newillegalstateexception()

;}}@suppresswarnings

("unchecked"

)@override

public

void

write

(jsonwriter out,

object value)

throws

ioexception

typeadapter

<

object

>

typeadapter =

(typeadapter

<

object

>

) gson.

getadapter

(value.

getclass()

);if(typeadapter instanceof

objecttypeadapter

) typeadapter.

write

(out, value);}

}

檢視read方法發現所有的number型別都被轉成了double型別,想要修改掉這個問題,需要自己實現乙個typeadapter,處理number型別的問題,自己重寫typeadapter,**如下:

public

class

datatypeadapter

extends

typeadapter

<

object

>

in.endarray()

;return list;

case begin_object:

map<

string

,object

>

map =

newlinkedtreemap

<

>()

; in.

beginobject()

;while

(in.

hasnext()

) in.

endobject()

;return map;

case string:

return in.

nextstring()

;case number:

/** * 改寫數字的處理邏輯,將數字值分為整型與浮點型。

*/double dbnum = in.

nextdouble()

;// 數字超過long的最大值,返回浮點型別

if(dbnum >

long

.max_value)

// 判斷數字是否為整數值

long lngnum =

(long

) dbnum;

if(dbnum == lngnum)

catch

(exception e)

}else

case boolean:

return in.

nextboolean()

;case null:

in.nextnull()

;return

null

;default

:throw

newillegalstateexception()

;}}@override

public

void

write

(jsonwriter out,

object value)

throws

ioexception

}

經過自己的處理將number型別都進行了轉換,分別轉為int、long和double,這樣就可以解決int轉為double的問題。

之後將自己重寫的typeadapter註冊一下

new

gsonbuilder()

.registertypeadapter

(new

typetoken

<

map<

string

,object

>

>()

.gettype()

,new

datatypeadapter()

).create()

;

這樣使用返回的gson物件進行轉換就不會出現上述的問題。

IP位址轉換 int轉string

實際程式設計中,ip位址多用整型來表示,如int unsigned int等。整型對於機器是友好的,對於編碼人員就不那麼友好了,畢竟我們還是喜歡用點分格式的ip位址,下面就寫了個簡單的小方法,供參考 使用 include stdafx.h include include include using ...

C語言 int 轉 char 隱式轉換 陷阱

今天看 時發現乙個問題,一時沒看出原因,問題我提取出來如下 char c 0xff if c 0xff else如果您能準確知道答案,那麼作為大神本文可能不適合你 答錯了的朋友,別灰心,我們一起來探索原因 執行結果 c 0xff1.把char的值分別以整數和無符號整數的形式列印出來 char c 0...

mysql轉 int mysql 如何轉 int

mysql轉int的方法 1 通過手動轉化型別 2 使用mysql函式cast實現轉換 3 使用mysql函式convert實現轉換。mysql varchar轉換為int 1.手動轉化型別 直接 0 示例 select server id from cardserver where game id...