$Java-json系列(一):用GSON解析Json格式數據

  GSON是谷歌提供的開源庫,用來解析Json格式的數據,很是好用。若是要使用GSON的話,則要先下載gson-2.2.4.jar這個文件,若是是在Android項目中使用,則在Android項目的libs目錄下添加這個文件便可;若是是在Java項目中,則把gson-2.2.4.jar先添加到當前項目的任意一個包中,而後右鍵點擊這個jar包 -> 構建路徑 -> 添加至構建路徑。這樣準備工做就作好了。java

  (一)單條無嵌套Json數據的解析json

  好比有以下Json數據:{"name":"John", "age":20}  //也能夠用單引號,寫成:{'name':'John', 'age':20}數組

  解析該數據步驟以下:ide

  一、定義Person類:工具

1 public class Person{
2 
3     private String name;  //屬性都定義成String類型,而且屬性名要和Json數據中的鍵值對的鍵名徹底同樣
4 
5     private String age;
6 
7     ...//提供全部屬性的getter和setter方法
8 
9 }

  二、建立GSON對象並解析:this

1 String jsonData = "{\"name\":\"John\", \"age\":20}";  //注:這裏也能夠不使用轉義字符,而用單引號:String jsonData = "{'name':'John', 'age':20}";
2 Gson gson = new Gson();
3 Person person = gson.fromJson(jsonData,Person.class);

  三、而後使用Person對象的getter方法就能夠獲取到數據了。 google

  四、擴展:考慮到Json數據的不一樣,那麼解析Json的時候所用的類也可能不一樣,好比這裏用的是Person,若是解析其餘數據可能用的又是Dog、Cat...因此考慮將用GSON解析的步驟封裝,並提供泛型參數,示例程序以下:spa

 1 import com.google.gson.Gson;
 2 
 3 /**
 4  * 用GSON解析單條Json數據
 5  *
 6  */
 7 public class GsonTest1 {
 8     public static void main(String[] args) {
 9         String jsonData = "{'name':'John', 'age':20}";
10         Person person = GsonUtil.parseJsonWithGson(jsonData, Person.class);
11         System.out.println(person.getName() + "," + person.getAge());
12     }
13 }
14 
15 /*
16  * 封裝的GSON解析工具類,提供泛型參數
17  */
18 class GsonUtil {
19     //將Json數據解析成相應的映射對象
20     public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
21         Gson gson = new Gson();
22         T result = gson.fromJson(jsonData, type);
23         return result;
24     }
25 
26 }
27 
28 class Person {
29     private String name;
30     private String age;
31 
32     public String getName() {
33         return name;
34     }
35 
36     public void setName(String name) {
37         this.name = name;
38     }
39 
40     public String getAge() {
41         return age;
42     }
43 
44     public void setAge(String age) {
45         this.age = age;
46     }
47 
48 }

輸出結果:code

John,20對象

 

  (二)單條有嵌套的Json數據解析

  好比有以下Json數據:{"name":"John", "age":20,"grade":{"course":"English","score":100,"level":"A"}}

  對這樣的數據就要用內部類的來解決了。解析步驟以下:

  一、定義Student類:

 1 class Student {
 2     private String name;
 3     private String age;
 4 
 5     private Grade grade;
 6 
 7     public class Grade { // 內部類要定義成public的
 8         private String course;
 9         private String score;
10         private String level;
11 
12         public String getCourse() {
13             return course;
14         }
15 
16         public void setCourse(String course) {
17             this.course = course;
18         }
19 
20         public String getScore() {
21             return score;
22         }
23 
24         public void setScore(String score) {
25             this.score = score;
26         }
27 
28         public String getLevel() {
29             return level;
30         }
31 
32         public void setLevel(String level) {
33             this.level = level;
34         }
35 
36         // 重寫toString方法
37         @Override
38         public String toString() {
39             return "Grade:[course = " + course + ", score = " + score
40                     + ", level = " + level + "]";
41         }
42     }
43 
44     // 重寫toString方法
45     @Override
46     public String toString() {
47         return "Student:[name = " + name + ", age = " + age + ", grade = "
48                 + grade + "]";
49     }
50 }

  二、使用(一)中封裝的GsonUtil工具類進行解析:

 1 public class GsonTest1 {
 2     public static void main(String[] args) {
 3         String jsonData = "{'name':'John', 'age':20,'grade':{'course':'English','score':100,'level':'A'}}";
 4         Student student = GsonUtil.parseJsonWithGson(jsonData, Student.class);
 5         System.out.println(student);
 6     }
 7 }
 8 
 9 /*
10  * 封裝的GSON解析工具類,提供泛型參數
11  */
12 class GsonUtil {
13     // 將Json數據解析成相應的映射對象
14     public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
15         Gson gson = new Gson();
16         T result = gson.fromJson(jsonData, type);
17         return result;
18     }
19 
20 }

輸出結果:

Student:[name = John, age = 20, grade = Grade:[course = English, score = 100, level = A]]

 

  (三)解析Json數組(多條Json數據)

  好比有以下Json數據:

  [{'name':'John', 'grade':[{'course':'English','score':100},{'course':'Math','score':78}]}, {'name':'Tom', 'grade':[{'course':'English','score':86},{'course':'Math','score':90}]}]   //注:Json數組最外層必定要加"[]"

  如何處理這樣的數據呢?就要用到List。步驟以下:

  示例程序以下:

 1 import java.lang.reflect.Type;
 2 import java.util.List;
 3 
 4 import com.google.gson.Gson;
 5 import com.google.gson.reflect.TypeToken;
 6 
 7 /**
 8  * 用GSON解析Json數組
 9  */
10 public class GsonTest {
11     public static void main(String[] args) {
12         // Json數組最外層要加"[]"
13         String jsonData = "[{'name':'John', 'grade':[{'course':'English','score':100},{'course':'Math','score':78}]},{'name':'Tom', 'grade':[{'course':'English','score':86},{'course':'Math','score':90}]}]";
14 
15         List<Student> students = GsonUtil.parseJsonArrayWithGson(jsonData,
16                 Student.class);
17         System.out.println(students);
18     }
19 }
20 
21 /*
22  * 封裝的GSON解析工具類,提供泛型參數
23  */
24 class GsonUtil {
25     // 將Json數據解析成相應的映射對象
26     public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
27         Gson gson = new Gson();
28         T result = gson.fromJson(jsonData, type);
29         return result;
30     }
31 
32     // 將Json數組解析成相應的映射對象列表
33     public static <T> List<T> parseJsonArrayWithGson(String jsonData,
34             Class<T> type) {
35         Gson gson = new Gson();
36         List<T> result = gson.fromJson(jsonData, new TypeToken<List<T>>() {
37         }.getType());
38         return result;
39     }
40 }
41 
42 class Student {
43     private String name;
44     private List<Grade> grade; // 由於grade是個數組,因此要定義成List
45 
46     public class Grade {
47         private String course;
48         private String score;
49 
50         public String getCourse() {
51             return course;
52         }
53 
54         public void setCourse(String course) {
55             this.course = course;
56         }
57 
58         public String getScore() {
59             return score;
60         }
61 
62         public void setScore(String score) {
63             this.score = score;
64         }
65 
66     }
67 
68     public String getName() {
69         return name;
70     }
71 
72     public void setName(String name) {
73         this.name = name;
74     }
75 
76     public List<Grade> getGrade() {
77         return grade;
78     }
79 
80     public void setGrade(List<Grade> grade) {
81         this.grade = grade;
82     }
83 }

輸出結果:

[{name=John, grade=[{course=English, score=100.0}, {course=Math, score=78.0}]}, {name=Tom, grade=[{course=English, score=86.0}, {course=Math, score=90.0}]}]

相關文章
相關標籤/搜索