當我們用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...