- <span style="font-size:18px;">package com.example.jsondemo;
- public class Person {
- private String name;
- private int age;
- private Birthday birthday;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Birthday getBirthday() {
- return birthday;
- }
- public void setBirthday(Birthday birthday) {
- this.birthday = birthday;
- }
- public Person() {
- super();
- }
- public Person(String name, int age, Birthday birthday) {
- super();
- this.name = name;
- this.age = age;
- this.birthday = birthday;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + ", birthday="
- + birthday + "]";
- }
- }</span>
爲了讓構造的對象更加複雜,所以定義了這個類,這樣person類的屬性就不只有基本數據類型了,讓我們的測試更有代表性。
- package com.example.jsondemo;
- /**
- *
- * @ClassName: com.example.jsondemo.Birthday
- * @Description: 生日類
- * @author zhaokaiqiang
- * @date 2014-11-26 上午10:29:47
- *
- */
- public class Birthday {
- private int year;
- private int month;
- private int day;
- public int getYear() {
- return year;
- }
- public void setYear(int year) {
- this.year = year;
- }
- public int getMonth() {
- return month;
- }
- public void setMonth(int month) {
- this.month = month;
- }
- public int getDay() {
- return day;
- }
- public void setDay(int day) {
- this.day = day;
- }
- public Birthday() {
- super();
- }
- public Birthday(int year, int month, int day) {
- super();
- this.year = year;
- this.month = month;
- this.day = day;
- }
- @Override
- public String toString() {
- return "Birthday [year=" + year + ", month=" + month + ", day=" + day
- + "]";
- }
- }
1.Object與Json的相互轉換
咱們先從最簡單的單一對象開始說。
下面是代碼實現
- <span style="font-size:18px;">/**
- * 單一對象的json生成與解析
- */
- public void objectToJson() {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- Gson gson = new Gson();
- String jsonString = gson.toJson(p);
- Log.d(TAG, "---------單一對象生成--------");
- Log.d(TAG, jsonString);
- Person person = gson.fromJson(jsonString, Person.class);
- Log.d(TAG, "---------單一對象解析--------");
- Log.d(TAG, person.toString());
- }</span>
這代碼是多麼的簡潔,美觀啊!
在上一篇的文章中,如果要生成簡單對象的話,我們還需要自己指定key,然後設置value,自從用了Gson,我們再也沒有這些煩惱了!而且爲了說明Gson的強大之處,我還特意給Person設置了一個對象Birthday,如果使用自帶的json工具,那不就麻煩死了。但是使用Gson,根本不需要有這些顧慮。看下面的轉換結果,一個toJson(),完全解決問題,太棒了!
- <span style="font-size:18px;">11-26 16:16:38.392: D/GsonTest(16931): ---------單一對象生成--------
- 11-26 16:16:38.392: D/GsonTest(16931): {"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}
- 11-26 16:16:38.392: D/GsonTest(16931): ---------單一對象解析--------
- 11-26 16:16:38.392: D/GsonTest(16931): Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]</span>
2.集合泛型與Json的相互轉換
Gson除了可以很方便的與單一對象進行轉換之外,還能夠與集合進行轉換。
下面是一個生成Json,並完成解析的代碼:
- /**
- * 集合對象的json生成與解析
- */
- public void objectsToJson() {
- Gson gson = new Gson();
- Person person = new Person("zhaokaiqiang", 22,
- new Birthday(1992, 1, 19));
- ArrayList<Person> arrayList = new ArrayList<Person>();
- arrayList.add(person);
- arrayList.add(person);
- arrayList.add(person);
- String jsonString = gson.toJson(arrayList);
- Log.d(TAG, "---------集合對象生成--------");
- Log.d(TAG, jsonString);
- Type type = new TypeToken<ArrayList<Person>>() {
- }.getType();
- ArrayList<Person> persons = gson.fromJson(jsonString, type);
- Log.d(TAG, "---------集合對象解析--------");
- Log.d(TAG, persons.toString());
- }
這是轉換出來的結果
- <span style="font-size:18px;">---------集合對象生成--------
- [{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}]
- ---------集合對象解析--------
- [Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]]
- </span>
如果我們想使用json完成類似的功能,複雜度是不可想象的,但是使用Gson來實現的話,卻是如此簡單。
在使用Gson.toJson()方法的時候,我們可以把任何對象或者是集合放進去,就可以完美的轉換成json格式。
如果想把json格式的數據轉換成我們想要的對象,我們只需要調用Gson.fromJson()即可。
但是在轉換的時候,第二個參數有兩種形式,一種是Class<?>,這個是轉換單一對象的時候,我們需要把對象.class傳遞進去,告訴轉換器要轉換的類型。如果我們需要轉換的是集合類型,我們需要傳遞一個實現了Type接口的實例,具體語法就和上面的代碼一樣,只要把你用的集合類型還有具體的對象換一下就可以了。
------------------------------------------------------------分割線------------------------------------------------------------------
以上的內容是最簡單的Gson的用法,我們基本上只使用到了Gson這一個類,對於基本需求來說沒問題,
但是,如果想要創建和解析複雜的Json數據,就有點不夠了。爲了說明如何使用Gson解析更加複雜的數據,
特添加以下內容,即Gson的更高級用法
------------------------------------------------------------分割線--------------------------------------------------------------------
3.複雜json數據結構的構建與解析
我們首先看看如何構建複雜的Json數據。
上一篇文章中,我們已經知道Json數據有兩種形式,Object形式(其實就是鍵值對形式),Array形式(即數組形式),我們以Object形式爲例,介紹構建複雜Json。
在開始構造之前,我們需要先介紹幾個常用對象。
Gson:這個類在前面已經用過了,是我們完成json轉換和解析的主要類,主要使用toJson()和fromJson()這兩個方法。
JsonObject:這個是我們構建Object形式的Json數據的主要類,我們可以設置key和value。
JsonElement:這個是Json元素類,它裏面可以是一個JsonObject、JsonArray、JsonNull或者是一個JsonPrimitive。注意,它裏面的數據只能看作是一個元素。
JsonArray:這個是我們想構造Array形式的主要類,我們可以往數組裏面添加數據,數據是有序的。
JsonParser:這個是Json的解析器,主要作用是把一個Json形式的字符串轉換成一個JsonElement對象。
介紹完這些常用對象之後,我們下面看一下代碼實現吧。
- public String getJsonString() {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- JsonElement jsonElement = new JsonParser().parse(new Gson().toJson(p));
- JsonObject jsonObject = new JsonObject();
- jsonObject.addProperty("name", "zhao");
- jsonObject.addProperty("age", 22);
- jsonObject.add("person", jsonElement);
- Log.d(TAG, "getJsonString------" + jsonObject.toString());
- return jsonObject.toString();
- }
下面是輸出的結果,沒有任何問題。
- getJsonString------{"name":"zhao","age":22,"person":{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}}
知道了如何使用上面的這些類實現Json數據構建之後,下面我們講解一下如何解析上面的這種複雜的json數據。
我們先看代碼吧
- public void fromJsonString() {
- Gson gson = new Gson();
- JsonElement jsonElement = new JsonParser().parse(getJsonString());
- JsonObject jsonObject = jsonElement.getAsJsonObject();
- JsonElement personElement = jsonObject.get("person");
- Person person = gson.fromJson(personElement, Person.class);
- JsonElement nameElement = jsonObject.get("name");
- String name = nameElement.getAsString();
- JsonElement ageElement = jsonObject.get("age");
- int age = ageElement.getAsInt();
- Log.d(TAG, "person-----" + person);
- Log.d(TAG, "name-----" + name);
- Log.d(TAG, "age-----" + age);
- }
如果我們要進行解析,我們必須獲取到JsonElement對象,然後轉換成JsonObject對象之後才能繼續處理,所以在代碼中進行了這樣的處理。因爲JsonElement是我們處理的基本元素,所以在獲取到JsonObject之後,我們還需要根據key獲取到對應value的JsonElement對象,然後根據不同的類型進行不同的轉換即可。