Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android-gson使用

android-gson使用

編輯:關於Android編程

平時用到也就那麼幾個方法,花費了時間學的東西用的少就忘記了,撿一撿是時候做做記錄了.為了以後復習起來也方便

json是一種格式,用來交換文本形式數據.解析json的方式也有很多,框架級的有gson;jackson;fastJson也就夠用了前兩種在google play Top200中使用率57,和15;fastJson沒有相關數據,可見gson的比重是相當大的下載與使用:github下載地址https://github.com/google/gson我是直接將源碼拿來放在項目中的,復制gson/gson/src/main/java下的文件放在自己工程的src/main/java下gson提供了兩個直接用於生成和解析json的方法,toJson()實現了序列化,fromjson()實現了反序列化

先說說基本用法(不得不貼代碼,但是插入代碼不夠顯眼和說明問題,我覺得還是截圖吧,有圖有真相,所有代碼都是我一個個敲出來的,運行在androidstudio上面,所以我敢說,代碼絕對跑的通)

解析基本數據類型--最基本最簡單的 圖中可以看見控制台上打出來的已經是把最基本的基本數據類型解析出來了

\

 

生成基本數據類型

\

 

下面做一點稍微復雜點的,簡單的java對象,生成與解析 先寫個簡單的javabean

\

 

生成json

\

 

可以看見已經通過簡單的bean生成了json格式數據 通過剛才的bean將生成的json數據解析出來

\

 

這個解析也可以通過手動來完成.不過開發中應該沒人手動去做,這裡就是介紹下

\

 

既然能手動解析json那麼能不能手動生成呢?肯定是可以的,看例子

\

 

接下來要說一個注解的使用 不知道看到這裡對上面的例子有沒有疑惑?在第一個例子中的double轉換時候,有沒有發現9.9是字符串?也就是string類型,其實那裡應該是這樣寫的("9.9", double.class);那麼為什麼寫成字符串也可以呢?是因為它有一定的容錯機制.但是有時候這個機制並不可行,比如我們把bean在加一個字段emailAddress;這是我們所期望的json應該是

{"name":"linzhiling","age":33,"emailAddress":"[email protected]"}

但是實際上卻是這樣的

{"name":"linzhiling","age":33,"email_address":"[email protected]"}

這種情況多出現在不同語言中.如java經常使用emailAddress方式,而php就會是email_address

這時的問題就是到底按照哪種方式?其實是有解決辦法的,就是注解@SerializedName需要做的就是把emailAddress加注解

\

 

這樣就滿足了不同編程語言的要求,也許這時候你想到了,那如果要是再有一種情況怎麼辦?也有辦法把注解變成數組形式

\

 

這樣就無論有幾種形式就全能搞定了那麼當多種情況同時出現的話,會怎麼樣呢?我們以注解多種情況為例

\

 

是了,是以最後一個為准的.

進入下一層次,復雜一點的解析,帶有泛型的

數組的解析,把數組形式的json解析出來

\

 

如果不是數組形式,而是List那應該怎麼做呢?直接把String[].class換成List.class是不行的,因為List和List的字節碼文件是一樣的都是List.class現在就要用到泛型了.當我們需要解析List時就要這樣做(因為TypeToken的構造方法是protected修飾的所以下面的代碼是new TypeToken>(){}.getType而不是new TypeToken>().getType)

\

 

泛型對bean設計的影響 可以很大程度的優化代碼,比如以下的兩種數據類型 {"code":"0", "state":"send","message":{}}{"code":"0", "state":"send","message":[]} 發送一條消息的時候,沒有異常出現,狀態碼都是0,狀態為發送,僅僅是message不同,這裡采用兩種數據類型存放message;那麼如果message裡面需要裝多個人的時候應該怎麼做呢?定義兩個bean嗎?比如這樣

\
{}這種形式就用User;[]這種形式就用List是不太好的

 

這種做法可以,但是相同的參數卻要重復定義多次,這就要用到泛型,下面看看怎麼樣做會好一些定義泛型類

\
USer類前面已經定義過了直接拿來用接下來就是生成兩種json的做法
\

 

生成了json然後再看下應該怎麼解析. 假如拿到了json數據,沒有使用泛型應該怎麼做?是這樣的需要創建兩個bean

\

 

還是重復定義了,有兩個接口還好,要是幾十個那可要崩潰了,定義那麼多;用泛型就好多了,現在把剛才生成的json解析

\

 

另一種情況的解析

\

 

減少了重復定義,封裝性更好,返回值類型更加直觀 使用GsonBuilder,格式化輸出,輸出null值,時間和日期 使用方法和例子

\

 

圖中例子說明,當需要比較完整的輸出,沒有值時候需要null這個方法就能用到了格式化輸出一些信息,從控制台就可以看出區別了 字段過濾 字段過濾有這麼幾種方式:使用注解/不同版本/訪問修飾符/自定義策略字段過濾的目的是使不想被序列化的字段不被序列化下面看一個例子

\

 

不需要序列化就要將這個字段排除.下面就分別介紹幾種方法 @Expose注解 注意這個注解在new Gson()時候是不起作用的,這個注解要想起作用是需要和GsonBuilder配合的在需要序列化的字段上加這個注解.是需要序列化的字段@Expose()有幾種用法 @Expose 等價於 @Expose(deserialize = true, serialize = true)//序列化和反序列化都生效@Expose(deserialize = true, serialize = false)//反序列化生效

@Expose(deserialize = false, serialize = true)//序列化生效

不加注解 等價於@Expose(deserialize = false, serialize = false)//不會被序列化 對於上面的例子就是這樣寫

\

 

在使用時候要這樣new

Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation()
        .create();
gson.toJson(people);

基於版本:Gson在對基於版本的字段導出提供了兩個注解:@Since和@Until這兩個注解要配合GsonBuilder.setVersion(double)配合使用
class SinceUntilSample {
    @Since(4)
    public String since;
    @Until(5)
    public String until;
}

public void sineUtilTest(double version){
        SinceUntilSample sinceUntilSample = new SinceUntilSample();
        sinceUntilSample.since = "since";
        sinceUntilSample.until = "until";
        Gson gson = new GsonBuilder().setVersion(version).create();
        System.out.println(gson.toJson(sinceUntilSample));
}
//當version <4時,結果:{"until":"until"}
//當version >=4 && version <5時,結果:{"since":"since","until":"until"}
//當version >=5時,結果:{"since":"since"}
修飾符都懂了,就是:public static final private protect
class ModifierSample {
    final String finalField = "final";
    static String staticField = "static";
    public String publicField = "public";
    protected String protectedField = "protected";
    String defaultField = "default";
    private String privateField = "private";
}
這裡要使用GsonBuilder.excludeFieldsWithModifiers創建Gson,所填寫的參數就是排除序列化的(使用這個方法的時候有點要注意的地方就是,很可能找不到Modifier,這時候需要手動導包
import java.lang.reflect.Modifier;)
ModifierSample modifierSample = new ModifierSample();
Gson gson = new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
        .create();
System.out.println(gson.toJson(modifierSample));
// 結果:{"publicField":"public","protectedField":"protected","defaultField":"default"}
強大的自定義,尤其是android中需要自定義的東西太多了.也體現了自定義的強大 未完待續

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved