參考鏈結
序列化使用gson將它序列化時,直接返回string
gson gson =
newgson()
;string userjson = gson.
tojson
(object)
;
反序列化string json ="";
gson gson =
newgson()
;jsonobjectbean jsonobjectbean = gson.
fromjson
(json,jsonobjectbean.
class);
toast.
maketext
(mcontext,jsonobjectbean.
tostring()
,toast.length_long)
.show()
;
liststring json =
"[\n"
+", ]"
;gson gson =
newgson()
;list
gsonarray = gson.
fromjson
(json,
newtypetoken
>()
.gettype()
);toast.
maketext
(mcontext,gsonarray.
tostring()
,toast.length_long)
.show()
;
值為null時,序列化/反序列化
序列化:當某個變數值為null時,gson在序列化的時候直接把這個變數忽略了。
反序列化:對於json字串裡沒有的變數,gson在反序列化時會給它乙個預設值,int型別預設為0,bool型別預設為false,string型別預設為null。
控制序列化/反序列化 的變數名稱
以user物件為例,目前user物件裡有四個變數name, age, email, isdeveloper。假如,某一天,json字串的變數名name變成了fullname,無需緊張,我們不用把user類裡的變數name改為fullname,然後把它的get和set方法都改了,然後把用到get/set方法的地方全改過來。只需要用gson提供的註解方法@serializedname就行了,如下:
public
class
user
這樣雖然json字串裡的變數名為fullname,但是反序列化後fullname的值會對映給name。同樣,把乙個user物件序列化,變數name會自動轉換為fullname。
然而現實遠比想象中複雜,這個json有時候傳的是fullname,有時候傳的是name,這時該怎麼辦呢? 不用擔心,@serializedname 接受兩個引數,value 和 alternate ,顧名思義,alternate 是備選變數名,比如下面這段**:
public
class
user
如果json傳的是name,那麼就用name的值,如果傳的是fullname,那麼就用fullname的值。需要注意的是,alternate只是反序列化json的乙個備選變數名,它不會影響序列化,user物件序列化後,會使用value定義的名稱為變數名。
又想到有乙個問題,在定義了value和alternate的情況下,假如json同時傳來了name和fullname,user的name變數會接受哪個值呢? 經過測試,它會都接受。這樣也是很合理的,因為gson會對json中的變數乙個乙個地去解析,既然它可以接受name,也可以接受fullname,那麼當同時傳來這兩個變數時,它就會分別把它們解析出來,並把值賦給user物件中的name變數。那麼,name變數的值就會是後解析的那個json變數的值,因為它會把前乙個值覆蓋掉。
序列化/反序列化過程中忽略某些變數
也許會出現這樣的需求,在將某個物件序列化時,物件中的某些變數是不需要的。有可能在反序列化某個json字串時,某些變數的值也是不需要的。
方法1: 可以使用gson提供的@expose註解方法。使用方法如下
// expose 註解的註解值宣告情況有四種
@expose
(serialize =
true
, deserialize =
true
)//序列化和反序列化都生效
@expose
(serialize =
false
, deserialize =
true
)//序列化時不生效,反序列化時生效
@expose
(serialize =
true
, deserialize =
false
)//序列化時生效,反序列化時不生效
@expose
(serialize =
false
, deserialize =
false
)//序列化和反序列化都不生效,和不寫註解一樣
public
class
user
使用這個方法,可以非常靈活地控制物件的某個/某些變數參不參與序列化/反序列化。
注意: 要使用expose這個註解來控制序列化/反序列化,就不能使用預設的gson物件
新建gson物件的方法如下:
gsonbuilder builder =
newgsonbuilder()
; builder.
excludefieldswithoutexposeannotation()
; gson gson = builder.
create()
;
方法2: transient關鍵字 ,使用這個關鍵字,可以直接讓變數不參與序列化/反序列化,如下:public
class
user
當然,使用預設的gson物件就可以。 gson基本介紹
public class message public class classroom message message newgson fromjson s,message.class gson解析jsonarray時,使用typetoken將陣列型別傳入到framjson 中即可 list mes...
Gson的簡單使用
person 欄位加getter setter 方法 也可以寫構造方法 public class person public person string name,int age public string getname public void setname string name public...
Gson框架的使用
主要是有三種不同型別的資料之間需要相互轉換。其中最簡單的就是 物件到json字串,使用gson例項中的tojson 方法,可以直接將乙個物件轉換成json字串。json字串到物件,使用gson例項中的fromjson 方法,可以直接將字串轉換成乙個物件。gson gson new gson stri...