1. 程式人生 > >GSON簡單實用及常用方法(附 .jar 地址)

GSON簡單實用及常用方法(附 .jar 地址)

Gson 是google解析Json的一個開源框架,同類的框架fastJson,JackJson等等

本人fastJson用了兩年,也是從去年才開始接觸Gson,希望下面的總結會對博友有用,至於Gson與FastJson的對比,其實半斤八兩的問題,不再贅述

第一步:在AS下面建立Java工程 並新增gson依賴

compile 'com.google.code.gson:gson:2.6.2'


Gson的例項化方式:

1:Gson gson=newGson();

2:通過GsonBuilder 可以配置多種選項

[java] view plain copy
print?在CODE上檢視程式碼片派生到我的程式碼片
  1. gson = new GsonBuilder()  
  2.                    .setLenient()// json寬鬆
  3.                    .enableComplexMapKeySerialization()//支援Map的key為複雜物件的形式
  4.                    .serializeNulls() //智慧null
  5.                    .setPrettyPrinting()// 調教格式
  6.                    .disableHtmlEscaping() //預設是GSON把HTML 轉義的
  7.                    .create();  
Gson的基本用法:

 JavaBean轉換Json字串

 gson提供 publicString toJson(Object src) 方法可以將物件轉換成jsonStr

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.xuan.gson;  
  2. import com.google.gson.Gson;  
  3. /** 
  4.  * @author xuanyouwu 
  5.  * @email [email protected] 
  6.  * @time 2016-05-18 10:39 
  7.  */
  8. publicclass GsonTest1 {  
  9.     publicstaticclass Student {  
  10.         private String name;  
  11.         privateint age;  
  12.         //省略setter getter equals
  13.     }  
  14.     privatestaticvoid log(String msg) {  
  15.         System.out.println(msg);  
  16.     }  
  17.     publicstaticvoid main(String[] args) throws Exception {  
  18.         Gson gson = new Gson();  
  19.         Student student = new Student();  
  20.         student.setName("xuanyouwu");  
  21.         student.setAge(26);  
  22.         String jsonStr = gson.toJson(student);  
  23.         log("---->javabean convert jsonStr:" + jsonStr);  
  24.     }  
  25. }  

執行結果:

---->javabean convert jsonStr:{"name":"xuanyouwu","age":26}

    List Map轉Json字串

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.xuan.gson;  
  2. import com.google.gson.Gson;  
  3. import java.util.Arrays;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. /** 
  8.  * @author xuanyouwu 
  9.  * @email [email protected] 
  10.  * @time 2016-05-18 10:39 
  11.  */
  12. publicclass GsonTest1 {  
  13.     privatestaticvoid log(String msg) {  
  14.         System.out.println(msg);  
  15.     }  
  16.     publicstaticvoid main(String[] args) throws Exception {  
  17.         Gson gson = new Gson();  
  18.         List<String> list = Arrays.asList("1""a""3""rt""5");  
  19.         log("---->list convert jsonStr:" + gson.toJson(list));  
  20.         Map<String, Object> content = new HashMap<String, Object>();  
  21.         content.put("name""xuanyouwu");  
  22.         content.put("age""26");  
  23.         log("---->map convert jsonStr:" + gson.toJson(content));  
  24.     }  
  25. }  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. 執行結果:  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. ---->list convert jsonStr:["1","a","3","rt","5"]  
  2. ---->map convert jsonStr:{"name":"xuanyouwu","age":"26"}  

       Json字串轉JavaBean

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";  
  2. Student student1 = gson.fromJson(studentJsonStr, Student.class);  
  3. log("------->json convert JavaBean:"+student1);  

      執行結果:

            ------->json convert JavaBean:Student{name='xuanyouwu', age=26}

   Json字串轉List

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. String listJsonStr="[\"1\",\"a\",\"3\",\"rt\",\"5\"]";  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Type type = new TypeToken<ArrayList<String>>() {  
  2. }.getType();  
  3. ArrayList<String> sList=gson.fromJson(listJsonStr, type);  
  4. log("------->json convert List:"+sList);  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. 執行結果:  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. ------->json convert List:[1, a, 3, rt, 5]  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. </pre><pre code_snippet_id="1687762" snippet_file_name="blog_20160518_11_939636" name="code"class="java">  Gson封裝的型別體系  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1.    Gson裡面有一個非常有意思的抽象基類JsonElement,他的繼承體系:  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <img src="https://img-blog.csdn.net/20160518135136864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1.  JsonObject等同於org的JSONObject,JsonArray也類似,  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. JsonNull 其實就是null 欄位  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. JsonNull jsonNull=new JsonNull();//構造方法過時,推薦INSTANCE
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. JsonNull jsonNull=JsonNull.INSTANCE;  
  2.   log("-----"+jsonNull);  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. 執行結果:  
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. -----null

     JsonPrimitive非常有意思,我們知道如果json轉換成字串 可能包含引號的轉義,但是通過JsonPrimative我們可以獲得為轉義的字串,看例項:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.xuan.gson;  
  2. import com.google.gson.JsonNull;  
  3. import com.google.gson.JsonPrimitive;  
  4. /** 
  5.  * @author xuanyouwu 
  6.  * @email [email protected] 
  7.  * @time 2016-05-18 11:20 
  8.  */
  9. publicclass GsonTest2 {  
  10.     privatestaticvoid log(String msg) {  
  11.         System.out.println(msg);  
  12.     }  
  13.     publicstaticvoid main(String[] args) throws Exception {  
  14.         String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";  
  15.         log("------>studentJsonStr:"+studentJsonStr);  
  16.         JsonPrimitive jsonPrimitive=new JsonPrimitive(studentJsonStr);  
  17.         log("------>jsonPrimitive:"+jsonPrimitive);  
  18.         log("------>jsonPrimitive:"+jsonPrimitive.toString());  
  19.         log("------>jsonPrimitive:"+jsonPrimitive.getAsString());  
  20.         JsonPrimitive jsonPrimitive2=new JsonPrimitive("this is String");  
  21.         log("------>jsonPrimitive2:"+jsonPrimitive2);  
  22.         log("------>jsonPrimitive2:"+jsonPrimitive2.toString());  
  23.         log("------>jsonPrimitive2:"+jsonPrimitive2.getAsString());  
  24.     }  
  25. }  

     執行結果:

------>studentJsonStr:{"name":"xuanyouwu","age":26}
------>jsonPrimitive:"{\"name\":\"xuanyouwu\",\"age\":26}"
------>jsonPrimitive:"{\"name\":\"xuanyouwu\",\"age\":26}"
------>jsonPrimitive:{"name":"xuanyouwu","age":26}
------>jsonPrimitive2:"this is String"
------>jsonPrimitive2:"this is String"
------>jsonPrimitive2:this is String


       建立JsonObject

           通過addPropert(key,value)可以向jsonObject中新增欄位 跟hashMap類似

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. JsonObject jsonObject=new JsonObject();  
  2. jsonObject.addProperty("name","xuanyouwu");  
  3. jsonObject.addProperty("age",26);  
  4. log("------>create jsonObject:"+jsonObject);  
            執行結果:

                ------>create jsonObject:{"name":"xuanyouwu","age":26}

    建立JsonArray       

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. JsonArray jsonElements=new JsonArray();  
  2.    jsonElements.add("a");  
  3.    jsonElements.add("b");  
  4.    jsonElements.add("c");  
  5.    jsonElements.add("d");  
  6.    log("------>create jsonArray:"+jsonElements);  
          執行結果:

          ------>create jsonArray:["a","b","c","d"]

     JsonObject 巢狀陣列或者說巢狀JsonArray

           通過JsonObject的add(key,JsonElement)可以為jsonObject 新增一個數組的欄位

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. JsonObject jsonObject2=new JsonObject();  
  2. jsonObject2.addProperty("name","xuanyouwu");  
  3. jsonObject2.addProperty("age",26);  
  4. JsonArray jsonElements2=new JsonArray();  
  5. jsonElements2.add("騎車");  
  6. jsonElements2.add("打遊戲");  
  7. jsonElements2.add("看電視");  
  8. jsonObject2.add("hobby",jsonElements2);  
  9. log("------>create jsonObject inner JsonArray:"+jsonObject2);  
           執行結果:

            ------>create jsonObject inner JsonArray:{"name":"xuanyouwu","age":26,"hobby":["騎車","打遊戲","看電視"]}

Gson註解

          在Gson中有五類註解

          

          重新命名註解:SerializedName 

             作用:轉換關鍵字key,json轉換成JavaBean時,json欄位的key 預設必須和我們宣告類的欄位名稱一樣,當伺服器端返回了關鍵字怎麼辦,比如key 為new switch這樣,我們    在宣告類的時候不能寫這樣的欄位,可能你想伺服器端改動,他可能要改資料庫,但是我告訴你,做服務端的大部分不願意改動他的json,是很自私的!這時候重新命名註解都排上用場了   第二種場景:伺服器端返回的json 的key 簡直太醜,或者太長,你想簡化,my_parent_name,可以簡化成mpn 比較優雅簡介

          例項:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.xuan.gson;  
  2. import com.google.gson.Gson;  
  3. import com.google.gson.annotations.SerializedName;  
  4. /** 
  5.  * @author xuanyouwu 
  6.  * @email [email protected] 
  7.  * @time 2016-05-18 11:20 
  8.  */
  9. publicclass GsonTest3 {  
  10.     privatestaticvoid log(String msg) {  
  11.         System.out.println(msg);  
  12.     }  
  13.     publicstaticclass User {  
  14.         public String name;  
  15.         publicint age;  
  16.         @SerializedName("new")  
  17.         publicint isnew;  
  18.         @Override
  19.         public String toString() {  
  20.             return"User{" +  
  21.                     "name='" + name + '\'' +  
  22.                     ", age=" + age +  
  23.                     ", isnew=" + isnew +  
  24.                     '}';  
  25.         }  
  26.     }  
  27.     publicstaticvoid main(String[] args) throws Exception {  
  28.         String jsonFromServer = "{\n" +  
  29.                 "    \"age\": 26,\n" +  
  30.                 "    \"name\": \"zhangsan\",\n" +  
  31.                 "    \"new\": 1\n" +  
  32.                 "}";  
  33.         Gson gson = new Gson();  
  34.         User user = gson.fromJson(jsonFromServer, User.class);  
  35.         log("------>user:" + user);  
  36.     }  
  37. }  

執行結果: ------>user:User{name='zhangsan', age=26, isnew=1}

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.xuan.gson;  
  2. import com.google.gson.Gson;  
  3. import com.google.gson.annotations.SerializedName;  
  4. /** 
  5.  * @author xuanyouwu 
  6.  * @email [email protected] 
  7.  * @time 2016-05-18 11:20 
  8.  */
  9. publicclass GsonTest3 {  
  10.     privatestaticvoid log(String msg) {  
  11.         System.out.println(msg);  
  12.     }  
  13.     publicstaticclass User2 {  
  14.         public String name;  
  15.         publicint age;  
  16.         @SerializedName("my_parent_name")  
  17.         public String pn;  
  18.         @Override
  19.         public String toStrin