Json是一種相似於XML的通用數據交換格式,具備比XML更高的傳輸效率.
從結構上看,全部的數據(data)最終均可以分解成三種類型:
第一種類型是標量(scalar),也就是一個單獨的字符串(string)或數字(numbers),好比"北京"這個單獨的詞。
第二種類型是序列(sequence),也就是若干個相關的數據按照必定順序並列在一塊兒,又叫作數組(array)或列表(List),好比"北京,上海"。
第三種類型是映射(mapping),也就是一個名/值對(Name/value),即數據有一個名稱,還有一個與之相對應的值,這又稱做散列(hash)或字典(dictionary),好比"首都:北京"。
Json的規格很是簡單,只用一個頁面幾百個字就能說清楚,並且Douglas Crockford聲稱這個規格永遠沒必要升級,由於該規定的都規定了。
1) 並列的數據之間用逗號(",")分隔。
2) 映射用冒號(":")表示。
3) 並列數據的集合(數組)用方括號("[]")表示。
4) 映射的集合(對象)用大括號("{}")表示。
-----------------------------------------------------------------
最快速入門貼:
1. 對象的序列化和反序列化
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,最簡方案打完收工.
2.使用GsonBuilder.
GsonBuilder用來生成Gson對象. 規定Gson的序列化和返序列化時的格式等內容.
如:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Id.class, new IdTypeAdapter())
.enableComplexMapKeySerialization()
.serializeNulls()
.setDateFormat(DateFormat.LONG)
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會把字段首字母大寫
.setPrettyPrinting()
.setVersion(1.0)
.create();
3. 使用註解,定製序列化字段.
默認狀況下@Expose註解是不起做用的,除非你用GsonBuilder建立Gson的時候調用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法
來個例子:
public class User {
@Expose private String firstName;
@Expose(serialize = false) private String lastName;
@Expose (serialize = false, deserialize = false)
private String emailAddress;
private String password;
}
若是你建立Gson對象的時候使用的是new Gson(),toJson()和fromJson()方法將會對所有的字段生效.可是若是你使用的是GsonBuilder而且調用了excludeFieldsWithoutExposeAnnotation()方法.那麼:toJson()和fromJson()將不會包括password.由於password沒有包含@Expose註解.
序列化的時候將不包括 lastName和emailAddress,由於註解中標明不進行序列化.一樣的道理,反序列化時將不包括emailAddress.
注:若是僅僅是想把某些特定的字段包含在外和話,可使用transient 關鍵字聲明字段.
4. 使用註解對序列化名稱進行聲明
這個簡單,上例子都能懂,不解釋:
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. 例用註解,根據版本進行序列化
有的字段不是一開始就有的,會隨着版本的升級添加進來,那麼在進行序列化和返序列化的時候就會根據版本號來選擇是否要序列化.
@Since(版本號)能完美地實現這個功能.
固然,GsonBuilder.setVersion(double)方法須要調用.
例程以下:
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;
}
還的字段可能,隨着版本的升級而刪除,那麼
@Until(版本號)也能實現這個功能,GsonBuilder.setVersion(double)方法須要調用.
public class User {
private String firstName;
private String lastName;
@Until(1.1) private String emailAddress;
@Until(1.1) private String password;
}
maven pom.xml 設置
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.1</version>
</dependency>