$Java-json系列(一):用GSON解析Json格式数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用。如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的libs目录下添加这个文件即可;如果是在Java项目中,则把gson-2.2.4.jar先添加到当前项目的任意一个包中,然后右键点击这个jar包 -> 构建路径 -> 添加至构建路径。这样准备工作就做好了。
(一)单条无嵌套Json数据的解析
比如有如下Json数据:{"name":"John", "age":20} //也可以用单引号,写成:{'name':'John', 'age':20}
解析该数据步骤如下:
1、定义Person类:
1 public class Person{ 2 3 private String name; //属性都定义成String类型,并且属性名要和Json数据中的键值对的键名完全一样 4 5 private String age; 6 7 ...//提供所有属性的getter和setter方法 8 9 }
2、创建GSON对象并解析:
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);
3、然后使用Person对象的getter方法就可以获取到数据了。
4、扩展:考虑到Json数据的不同,那么解析Json的时候所用的类也可能不同,比如这里用的是Person,如果解析其他数据可能用的又是Dog、Cat...所以考虑将用GSON解析的步骤封装,并提供泛型参数,示例程序如下:
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 }
输出结果:
John,20
(二)单条有嵌套的Json数据解析
比如有如下Json数据:{"name":"John", "age":20,"grade":{"course":"English","score":100,"level":"A"}}
对这样的数据就要用内部类的来解决了。解析步骤如下:
1、定义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 }
2、使用(一)中封装的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}]}]