zoukankan      html  css  js  c++  java
  • $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}]}]

  • 相关阅读:
    乱谈服务器编程
    set global slow_query_log引起的MySQL死锁
    一个由string使用不当产生的问题
    Hbase初体验
    浅谈SQLite——查询处理及优化
    ACID、Data Replication、CAP与BASE
    libevent源码分析
    浅析Linux Native AIO的实现
    vim7.2中文乱码解决方法
    伸展树的点点滴滴
  • 原文地址:https://www.cnblogs.com/jiayongji/p/5297187.html
Copyright © 2011-2022 走看看