Gson的使用

Java對象和Json之間的互轉,通常用的比較多的兩個類庫是Jackson和Gson,下面記錄一下Gson的學習使用。json

基礎概念:api

 Serialization:序列化,使Java對象到Json字符串的過程。學習

 Deserialization:反序列化,字符串轉換成Java對象ui

Gson的兩個基礎方法spa

toJson();
fromJson();

Gson的建立方式一:直接new Gson對象code

// 使用new方法
Gson gson = new Gson();

// toJson 將bean對象轉換爲json字符串
String jsonStr = gson.toJson(user, User.class);

// fromJson 將json字符串轉爲bean對象
Student user= gson.fromJson(jsonStr, User.class);

// **序列化List**
String jsonStr2 = gson.toJson(list);

// **反序列化成List時須要使用到TypeToken getType()**
List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType());

Gson的建立方式二:使用GsonBuilderorm

使用new Gson(),此時會建立一個帶有默認配置選項的Gson實例,若是不想使用默認配置,那麼就能夠使用GsonBuilder。對象

//serializeNulls()是GsonBuilder提供的一種配置,當字段值爲空或null時,依然對該字段進行轉換
Gson gson = new GsonBuilder().serializeNulls().create(); 

使用GsonBuilder建立Gson實例的步驟:blog

首先建立GsonBuilder,而後調用GsonBuilder提供的各類配置方法進行配置,最後調用GsonBuilder的create方法,將基於當前的配置建立一個Gson實例。接口

GsonBuilder的一些配置

Gson gson = new GsonBuilder()
         .excludeFieldsWithoutExposeAnnotation() //不對沒有用@Expose註解的屬性進行操做
         .enableComplexMapKeySerialization() //當Map的key爲複雜對象時,須要開啓該方法
         .serializeNulls() //當字段值爲空或null時,依然對該字段進行轉換
         .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //時間轉化爲特定格式
         .setPrettyPrinting() //對結果進行格式化,增長換行
         .disableHtmlEscaping() //防止特殊字符出現亂碼
         .registerTypeAdapter(User.class,new UserAdapter()) //爲某特定對象設置固定的序列或反序列方式,自定義Adapter需實現JsonSerializer或者JsonDeserializer接口
         .create();

例如:Gosn對複雜Map的處理時須要用到其中的 enableComplexMapKeySerialization() 配置:

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); //開啓複雜處理Map方法
Map<List<User>, String> map = new HashMap<List<User>, String>();
// TODO 向map中添加數據
String jsonStr = gson.toJson(map);  //toJson
Map<List<User>, String> resultMap = gson.fromJson(jsonStr,new TypeToken<Map<List<User>, String>>() {}.getType()); //fromJson

注意:若是Map的key爲String,則能夠不使用GsonBuilder的enableComplexMapKeySerialization()方法,或者直接new Gson();

Gson的註解:

@Expose註解

public class User {
  @Expose
  private String firstName;

  @Expose(serialize = false)
  private String lastName;

  @Expose(deserialize = false)
  private String emailAddress;

  private String password;
}

@Expose中serialize和deserialize屬性是可選的,默認兩個都爲true。

若是serialize爲true,調用toJson時會序列化該屬性,

若是deserialize爲true,調用fromJson生成Java對象時不會進行反序列化。

注意:

若是採用new Gson()方式建立Gson,@Expose沒有任何效果。須要使用 gsonBuilder.excludeFieldsWithoutExposeAnnotation()方法。

 

@SerializedName註解    能指定該字段在序列化成json時的名稱

@SerializedName("w")
  private int width;
相關文章
相關標籤/搜索