1. 程式人生 > >gson 的基本用法

gson 的基本用法

Gson的基本用法:

1、toJson 將object轉化為json字串

將此實體類轉化為json字串

class Persion{
        public Persion(String name, int age) {
            this.name = name;
            this.age = age;
        }
        private String name;
        private int age;
}

demo:

Gson gson = new Gson();
String json = gson.toJson(new Persion("lucy",10));

結果:

{“age”:10,”name”:”lucy”}

Gson gson = new Gson();
List<Persion> list = new ArrayList<>();
for(int i=0;i<5;i++){
    list.add(new Persion("lucy"+i,i));
}
String json = gson.toJson(list);

結果:

[{“age”:0,”name”:”lucy0”},{“age”:1,”name”:”lucy1”},{“age”:2,”name”:”lucy2”},{“age”:3,”name”:”lucy3”},{“age”:4,”name”:”lucy4”}]

Map<String,Object> map = new HashMap<>();
map.put("name","lucy");
map.put("age",10);
String json = gson.toJson(list);

結果:

{“age”:10,”name”:”lucy”}

這裡列舉了3中情況的轉化(bean、List、Map),將json序列化為JavaBean其實就是上面反過來。

String json = "{\"age\":10,\"name\":\"lucy\"}";
Persion persion = gson.fromJson(json,Persion.class);

結果:

返回一個Person物件並賦值

String json = "{\"Age\":10,\"name\":\"lucy\"}";
Persion persion = gson.fromJson(json,Persion.class);

注意和上面的區別,我們將age變為Age
結果:

仍然返回一個person物件,不過age的值為0,name為lucy,說明gson是區分大小寫的

由於後臺和我們前臺的命名規範可能不同,而且你讓後臺去改json串,人家也不一定改,我們定義bean的時候也不能按照json來定義,我們也要遵守我們的命名規範,這個時候註解就登場了。

1、重新命名註解:SerializedName
這個註解就是解決json的key和bean中名稱不一致。

class Persion{
    public Persion(String name, int age) {
        this.name = name;
        this.age = age;
    }
    private String name;
    @SerializedName("Age")
    private int age;
}

我們在age屬性上面加上@SerializedName(“Age”),這個時候在執行上面的程式碼就能正常返回了。

我們再來看看SerializedName的另一種用法:

@SerializedName(value = “name”,alternate = {“name1”,”name2”})
private String name;

這種用法是把json串key為name,name1,name2的值都賦值給name,注意後面的值會把前面的覆蓋掉,這個是根據json串的順序來的根據json串的順序來的根據json串的順序來的,重要的事情說3遍。比如:

String json = "{\"Age\":10,\"name1\":\"lucy1\",\"name2\":\"lucy2\",\"name\":\"lucy\"}";

name的值為:lucy

比如:

String json = "{\"Age\":10,\"name1\":\"lucy1\",\"name\":\"lucy\",\"name2\":\"lucy2\"}";

name的值為:lucy2

到這裡gson已經能夠解決95%的問題了,當然gson還提供了一些高階方法:

@Expose :指定(反)序列化哪些欄位。
@Since(float v)、@Util(float v): 版本控制,不同的版本,我們api介面可能會發生變化,可以用這個欄位來指定哪些可以(反)序列化

基本的就瞭解到這吧,其實還有一些高階用法比如TypeAdapter ,比如age想要一個int值,json返回的是String值,如何做容錯處理?以後用到在研究吧。