google-gson 序列化Object to json ,GsonBuilder設(shè)置 如version意義,注解 等
Posted on 2012-04-16 16:16 云云 閱讀(8792) 評(píng)論(1) 編輯 收藏google-gson-2.1-release.zip
-----------------------------------------------------------------
掃盲:
Json是一種類(lèi)似于XML的通用數(shù)據(jù)交換格式,具有比XML更高的傳輸效率.
從結(jié)構(gòu)上看,所有的數(shù)據(jù)(data)最終都可以分解成三種類(lèi)型:
第一種類(lèi)型是標(biāo)量(scalar),也就是一個(gè)單獨(dú)的字符串(string)或數(shù)字(numbers),比如"北京"這個(gè)單獨(dú)的詞。
第二種類(lèi)型是序列(sequence),也就是若干個(gè)相關(guān)的數(shù)據(jù)按照一定順序并列在一起,又叫做數(shù)組(array)或列表(List),比如"北京,上海"。
第三種類(lèi)型是映射(mapping),也就是一個(gè)名/值對(duì)(Name/value),即數(shù)據(jù)有一個(gè)名稱(chēng),還有一個(gè)與之相對(duì)應(yīng)的值,這又稱(chēng)作散列(hash)或字典(dictionary),比如"首都:北京"。
Json的規(guī)格非常簡(jiǎn)單,只用一個(gè)頁(yè)面幾百個(gè)字就能說(shuō)清楚,而且Douglas Crockford聲稱(chēng)這個(gè)規(guī)格永遠(yuǎn)不必升級(jí),因?yàn)樵撘?guī)定的都規(guī)定了。
1) 并列的數(shù)據(jù)之間用逗號(hào)(",")分隔。
2) 映射用冒號(hào)(":")表示。
3) 并列數(shù)據(jù)的集合(數(shù)組)用方括號(hào)("[]")表示。
4) 映射的集合(對(duì)象)用大括號(hào)("{}")表示。
-----------------------------------------------------------------
最快速入門(mén)貼:
1. 對(duì)象的序列化和反序列化
Type listType = new TypeToken<List<String>>() {}.getType();
List<String> target = new LinkedList<String>();
target.add("blah");
Gson gson = new Gson();
String json = gson.toJson(target, listType);
List<String> target2 = gson.fromJson(json, listType);
OK,最簡(jiǎn)方案打完收工.
2.使用GsonBuilder.
GsonBuilder用來(lái)生成Gson對(duì)象. 規(guī)定Gson的序列化和返序列化時(shí)的格式等內(nèi)容.
如:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Id.class, new IdTypeAdapter()).enableComplexMapKeySerialization()
.serializeNulls()
.setDateFormat(DateFormat.LONG)
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會(huì)把字段首字母大寫(xiě)
.setPrettyPrinting()
.setVersion(1.0)
.create();
3. 使用注解,定制序列化字段.默認(rèn)情況下@Expose注解是不起作用的,除非你用GsonBuilder創(chuàng)建Gson的時(shí)候調(diào)用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法
來(lái)個(gè)例子:
public class User {
@Expose private String firstName;
@Expose(serialize = false) private String lastName;
@Expose (serialize = false, deserialize = false)
private String emailAddress; private String password;
}
如果你創(chuàng)建Gson對(duì)象的時(shí)候使用的是new Gson(),toJson()和fromJson()方法將會(huì)對(duì)全部的字段生效.但是如果你使用的是GsonBuilder并且調(diào)用了excludeFieldsWithoutExposeAnnotation()方法.那么:toJson()和fromJson()將不會(huì)包括password.因?yàn)閜assword沒(méi)有包含@Expose注解.
序列化的時(shí)候?qū)⒉话?lastName和emailAddress,因?yàn)樽⒔庵袠?biāo)明不進(jìn)行序列化.同樣的道理,反序列化時(shí)將不包括emailAddress.
注:如果僅僅是想把某些特定的字段包含在外和話,可以使用transient 關(guān)鍵字聲明字段.
4. 使用注解對(duì)序列化名稱(chēng)進(jìn)行聲明
這個(gè)簡(jiǎn)單,上例子都能懂,不解釋:
public class SomeClassWithFields {
@SerializedName("name")
private final String someField;private final String someOtherField;
public SomeClassWithFields(String a, String b) {
this.someField = a;
this.someOtherField = b;}
}
===== OUTPUT =====
{"name":"a","someOtherField":"b"}
5. 例用注解,根據(jù)版本進(jìn)行序列化有的字段不是一開(kāi)始就有的,會(huì)隨著版本的升級(jí)添加進(jìn)來(lái),那么在進(jìn)行序列化和返序列化的時(shí)候就會(huì)根據(jù)版本號(hào)來(lái)選擇是否要序列化.@Since(版本號(hào))能完美地實(shí)現(xiàn)這個(gè)功能.當(dāng)然,GsonBuilder.setVersion(double)方法需要調(diào)用.例程如下:public class User {
private String firstName;
private String lastName;
@Since(1.0) private String emailAddress;
@Since(1.0) private String password;
@Since(1.1) private Address address;
}
還的字段可能,隨著版本的升級(jí)而刪除,那么@Until(版本號(hào))也能實(shí)現(xiàn)這個(gè)功能,GsonBuilder.setVersion(double)方法需要調(diào)用.public class User {
private String firstName;
private String lastName;
@Until(1.1) private String emailAddress;
@Until(1.1) private String password;
}
maven pom.xml 設(shè)置
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.1</version>
</dependency>