Gson 解析Json数据

来源:互联网 发布:lol英雄详细数据 编辑:程序博客网 时间:2024/05/11 11:21

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         @Override38         public String toString() {39             return "Grade:[course = " + course + ", score = " + score40                     + ", level = " + level + "]";41         }42     }43 44     // 重写toString方法45     @Override46     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是个数组,所以要定义成List45 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}]}] 


转载自:http://www.cnblogs.com/jiayongji/p/5297187.html

0 0
原创粉丝点击