本文為作者根據(jù)日常使用結合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容,轉(zhuǎn)載請注明出處。
該系列其它文章
注:此系列基于Gson 2.4咐容。
上一篇文章 你真的會用Gson嗎?Gson使用指南(一) 我們了解了Gson的基礎用法栅螟,這次我們繼續(xù)深入了解Gson的使用方法执俩。
本次的主要內(nèi)容:
- Gson的流式反序列化
- Gson的流式序列化
- 使用GsonBuilder導出null值徐钠、格式化輸出、日期時間及其它小功能
一役首、Gson的流式反序列化
自動方式
Gson提供了
fromJson()
和toJson()
兩個直接用于解析和生成的方法尝丐,前者實現(xiàn)反序列化,后者實現(xiàn)了序列化衡奥。同時每個方法都提供了重載方法爹袁,我常用的總共有5個。
這是我在上一篇文章開頭說的矮固,但我到最后也一直沒有是哪5個呢簸,這次我給列出來之后,你就知道這次講的是哪個了。
Gson.toJson(Object);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);
好了根时,本節(jié)結束!
手動方式
手動的方式就是使用stream
包下的JsonReader
類來手動實現(xiàn)反序列化蛤迎,和Android中使用pull解析XML是比較類似的。
String json = "{\"name\":\"怪盜kidou\",\"age\":\"24\"}";
User user = new User();
JsonReader reader = new JsonReader(new StringReader(json));
reader.beginObject(); // throws IOException
while (reader.hasNext()) {
String s = reader.nextName();
switch (s) {
case "name":
user.name = reader.nextString();
break;
case "age":
user.age = reader.nextInt(); //自動轉(zhuǎn)換
break;
case "email":
user.email = reader.nextString();
break;
}
}
reader.endObject(); // throws IOException
System.out.println(user.name); // 怪盜kidou
System.out.println(user.age); // 24
System.out.println(user.email); // ikidou@example.com
其實自動方式最終都是通過JsonReader
來實現(xiàn)的含友,如果第一個參數(shù)是String
類型替裆,那么Gson會創(chuàng)建一個StringReader
轉(zhuǎn)換成流操作。
二窘问、Gson的流式序列化
自動方式
所以啊辆童,學會利用IDE的自動完成是多么重要這下知道了吧!
可以看出用紅框選中的部分就是我們要找的東西惠赫。
提示:PrintStream
(System.out) 把鉴、StringBuilder
、StringBuffer
和*Writer
都實現(xiàn)了Appendable
接口儿咱。
Gson gson = new Gson();
User user = new User("怪盜kidou",24,"ikidou@example.com");
gson.toJson(user,System.out); // 寫到控制臺
手動方式
JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));
writer.beginObject() // throws IOException
.name("name").value("怪盜kidou")
.name("age").value(24)
.name("email").nullValue() //演示null
.endObject(); // throws IOException
writer.flush(); // throws IOException
//{"name":"怪盜kidou","age":24,"email":null}
提示:除了beginObject
庭砍、endObject
還有beginArray
和endArray
,兩者可以相互嵌套混埠,注意配對即可怠缸。beginArray
后不可以調(diào)用name
方法,同樣beginObject
后在調(diào)用value
之前必須要調(diào)用name
方法钳宪。
三揭北、 使用GsonBuilder導出null值、格式化輸出吏颖、日期時間
一般情況下Gson
類提供的 API已經(jīng)能滿足大部分的使用場景搔体,但我們需要更多更特殊、更強大的功能時侦高,這時候就引入一個新的類 GsonBuilder
嫉柴。
GsonBuilder
從名上也能知道是用于構建Gson實例的一個類,要想改變Gson默認的設置必須使用該類配置Gson奉呛。
GsonBuilder用法
Gson gson = new GsonBuilder()
//各種配置
.create(); //生成配置好的Gson
Gson在默認情況下是不動導出值null
的鍵的计螺,如:
public class User {
//省略其它
public String name;
public int age;
public String email;
}
Gson gson = new Gson();
User user = new User("怪盜kidou",24);
System.out.println(gson.toJson(user)); //{"name":"怪盜kidou","age":24}
可以看出,email
字段是沒有在json中出現(xiàn)的瞧壮,當我們在調(diào)試是登馒、需要導出完整的json串時或API接中要求沒有值必須用Null時,就會比較有用咆槽。
使用方法:
Gson gson = new GsonBuilder()
.serializeNulls()
.create();
User user = new User("怪盜kidou", 24);
System.out.println(gson.toJson(user)); //{"name":"怪盜kidou","age":24,"email":null}
格式化輸出陈轿、日期時間及其它:
這些都比較簡單就不一一分開寫了。
Gson gson = new GsonBuilder()
//序列化null
.serializeNulls()
// 設置日期時間格式,另有2個重載方法
// 在序列化和反序化時均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化內(nèi)部類
.disableInnerClassSerialization()
//生成不可執(zhí)行的Json(多了 )]}' 這4個字符)
.generateNonExecutableJson()
//禁止轉(zhuǎn)義html標簽
.disableHtmlEscaping()
//格式化輸出
.setPrettyPrinting()
.create();
注意:內(nèi)部類(Inner Class)和嵌套類(Nested Class)的區(qū)別
這次文章就到這里麦射,歡迎提問互動蛾娶,如有不對的地方請指正。
下篇文章內(nèi)容提要
- 字段過濾的幾種方法
- 基于
@Expose
注解 - 基于訪問修飾符
- 基于版本
- 自定義規(guī)則
- POJO與JSON的字段映射規(guī)則
我最近剛剛開通了微信公眾號(怪盜kidou)潜秋,歡迎關注