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}]}]