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- gson = new GsonBuilder()
- .setLenient()// json寬鬆
- .enableComplexMapKeySerialization()//支援Map的key為複雜物件的形式
- .serializeNulls() //智慧null
- .setPrettyPrinting()// 調教格式
- .disableHtmlEscaping() //預設是GSON把HTML 轉義的
- .create();
JavaBean轉換Json字串
gson提供 publicString toJson(Object src) 方法可以將物件轉換成jsonStr
[java] view plain copy print?- package com.xuan.gson;
- import com.google.gson.Gson;
- /**
- * @author xuanyouwu
- * @email [email protected]
- * @time 2016-05-18 10:39
- */
- publicclass GsonTest1 {
- publicstaticclass Student {
- private String name;
- privateint age;
- //省略setter getter equals
- }
- privatestaticvoid log(String msg) {
- System.out.println(msg);
- }
- publicstaticvoid main(String[] args) throws Exception {
- Gson gson = new Gson();
- Student student = new Student();
- student.setName("xuanyouwu");
- student.setAge(26);
- String jsonStr = gson.toJson(student);
- log("---->javabean convert jsonStr:" + jsonStr);
- }
- }
執行結果:
---->javabean convert jsonStr:{"name":"xuanyouwu","age":26}
List Map轉Json字串
[java] view plain copy print?- package com.xuan.gson;
- import com.google.gson.Gson;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- * @author xuanyouwu
- * @email [email protected]
- * @time 2016-05-18 10:39
- */
- publicclass GsonTest1 {
- privatestaticvoid log(String msg) {
- System.out.println(msg);
- }
- publicstaticvoid main(String[] args) throws Exception {
- Gson gson = new Gson();
- List<String> list = Arrays.asList("1", "a", "3", "rt", "5");
- log("---->list convert jsonStr:" + gson.toJson(list));
- Map<String, Object> content = new HashMap<String, Object>();
- content.put("name", "xuanyouwu");
- content.put("age", "26");
- log("---->map convert jsonStr:" + gson.toJson(content));
- }
- }
- 執行結果:
- ---->list convert jsonStr:["1","a","3","rt","5"]
- ---->map convert jsonStr:{"name":"xuanyouwu","age":"26"}
Json字串轉JavaBean
[java] view plain copy print?- String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";
- Student student1 = gson.fromJson(studentJsonStr, Student.class);
- log("------->json convert JavaBean:"+student1);
執行結果:
------->json convert JavaBean:Student{name='xuanyouwu', age=26}
Json字串轉List
[java] view plain copy print?- String listJsonStr="[\"1\",\"a\",\"3\",\"rt\",\"5\"]";
- Type type = new TypeToken<ArrayList<String>>() {
- }.getType();
- ArrayList<String> sList=gson.fromJson(listJsonStr, type);
- log("------->json convert List:"+sList);
- 執行結果:
- ------->json convert List:[1, a, 3, rt, 5]
- </pre><pre code_snippet_id="1687762" snippet_file_name="blog_20160518_11_939636" name="code"class="java"> Gson封裝的型別體系
- Gson裡面有一個非常有意思的抽象基類JsonElement,他的繼承體系:
- <img src="https://img-blog.csdn.net/20160518135136864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
- JsonObject等同於org的JSONObject,JsonArray也類似,
- JsonNull 其實就是null 欄位
- JsonNull jsonNull=new JsonNull();//構造方法過時,推薦INSTANCE
- JsonNull jsonNull=JsonNull.INSTANCE;
- log("-----"+jsonNull);
- 執行結果:
- -----null
JsonPrimitive非常有意思,我們知道如果json轉換成字串 可能包含引號的轉義,但是通過JsonPrimative我們可以獲得為轉義的字串,看例項:
[java] view plain copy print?- package com.xuan.gson;
- import com.google.gson.JsonNull;
- import com.google.gson.JsonPrimitive;
- /**
- * @author xuanyouwu
- * @email [email protected]
- * @time 2016-05-18 11:20
- */
- publicclass GsonTest2 {
- privatestaticvoid log(String msg) {
- System.out.println(msg);
- }
- publicstaticvoid main(String[] args) throws Exception {
- String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";
- log("------>studentJsonStr:"+studentJsonStr);
- JsonPrimitive jsonPrimitive=new JsonPrimitive(studentJsonStr);
- log("------>jsonPrimitive:"+jsonPrimitive);
- log("------>jsonPrimitive:"+jsonPrimitive.toString());
- log("------>jsonPrimitive:"+jsonPrimitive.getAsString());
- JsonPrimitive jsonPrimitive2=new JsonPrimitive("this is String");
- log("------>jsonPrimitive2:"+jsonPrimitive2);
- log("------>jsonPrimitive2:"+jsonPrimitive2.toString());
- log("------>jsonPrimitive2:"+jsonPrimitive2.getAsString());
- }
- }
執行結果:
------>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?- JsonObject jsonObject=new JsonObject();
- jsonObject.addProperty("name","xuanyouwu");
- jsonObject.addProperty("age",26);
- log("------>create jsonObject:"+jsonObject);
------>create jsonObject:{"name":"xuanyouwu","age":26}
建立JsonArray
[java] view plain copy print?- JsonArray jsonElements=new JsonArray();
- jsonElements.add("a");
- jsonElements.add("b");
- jsonElements.add("c");
- jsonElements.add("d");
- log("------>create jsonArray:"+jsonElements);
------>create jsonArray:["a","b","c","d"]
JsonObject 巢狀陣列或者說巢狀JsonArray
通過JsonObject的add(key,JsonElement)可以為jsonObject 新增一個數組的欄位
[java] view plain copy print?- JsonObject jsonObject2=new JsonObject();
- jsonObject2.addProperty("name","xuanyouwu");
- jsonObject2.addProperty("age",26);
- JsonArray jsonElements2=new JsonArray();
- jsonElements2.add("騎車");
- jsonElements2.add("打遊戲");
- jsonElements2.add("看電視");
- jsonObject2.add("hobby",jsonElements2);
- 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?- package com.xuan.gson;
- import com.google.gson.Gson;
- import com.google.gson.annotations.SerializedName;
- /**
- * @author xuanyouwu
- * @email [email protected]
- * @time 2016-05-18 11:20
- */
- publicclass GsonTest3 {
- privatestaticvoid log(String msg) {
- System.out.println(msg);
- }
- publicstaticclass User {
- public String name;
- publicint age;
- @SerializedName("new")
- publicint isnew;
- @Override
- public String toString() {
- return"User{" +
- "name='" + name + '\'' +
- ", age=" + age +
- ", isnew=" + isnew +
- '}';
- }
- }
- publicstaticvoid main(String[] args) throws Exception {
- String jsonFromServer = "{\n" +
- " \"age\": 26,\n" +
- " \"name\": \"zhangsan\",\n" +
- " \"new\": 1\n" +
- "}";
- Gson gson = new Gson();
- User user = gson.fromJson(jsonFromServer, User.class);
- log("------>user:" + user);
- }
- }
執行結果: ------>user:User{name='zhangsan', age=26, isnew=1}
[java] view plain copy print?- package com.xuan.gson;
- import com.google.gson.Gson;
- import com.google.gson.annotations.SerializedName;
- /**
- * @author xuanyouwu
- * @email [email protected]
- * @time 2016-05-18 11:20
- */
- publicclass GsonTest3 {
- privatestaticvoid log(String msg) {
- System.out.println(msg);
- }
- publicstaticclass User2 {
- public String name;
- publicint age;
- @SerializedName("my_parent_name")
- public String pn;
- @Override
- public String toStrin