你真的會用Gson嗎?Gson使用指南(二)

本文為作者根據(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é)結束!

看第2辰晕、4行,Reader懂了吧

手動方式
手動的方式就是使用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流式解析

二窘问、Gson的流式序列化

自動方式

Gson.toJson方法列表

所以啊辆童,學會利用IDE的自動完成是多么重要這下知道了吧!
可以看出用紅框選中的部分就是我們要找的東西惠赫。

提示:PrintStream(System.out) 把鉴、StringBuilderStringBuffer*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還有beginArrayendArray,兩者可以相互嵌套混埠,注意配對即可怠缸。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)潜秋,歡迎關注

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛔琅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子峻呛,更是在濱河造成了極大的恐慌罗售,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩述,死亡現(xiàn)場離奇詭異寨躁,居然都是意外死亡,警方通過查閱死者的電腦和手機牙勘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門职恳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谜悟,你說我怎么就攤上這事话肖。” “怎么了葡幸?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵最筒,是天一觀的道長。 經(jīng)常有香客問我蔚叨,道長床蜘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任蔑水,我火速辦了婚禮邢锯,結果婚禮上,老公的妹妹穿的比我還像新娘搀别。我一直安慰自己丹擎,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布歇父。 她就那樣靜靜地躺著蒂培,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榜苫。 梳的紋絲不亂的頭發(fā)上护戳,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音垂睬,去河邊找鬼媳荒。 笑死抗悍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钳枕。 我是一名探鬼主播缴渊,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鱼炒!你這毒婦竟也來了疟暖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤田柔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骨望,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬爆,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年擎鸠,在試婚紗的時候發(fā)現(xiàn)自己被綠了缀磕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡劣光,死狀恐怖袜蚕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绢涡,我是刑警寧澤牲剃,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站雄可,受9級特大地震影響凿傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜数苫,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一聪舒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虐急,春花似錦箱残、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赏殃,卻和暖如春敷待,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仁热。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工榜揖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勾哩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓举哟,卻偏偏與公主長得像思劳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妨猩,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容