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类:

 public class Person{

     private String name;  //属性都定义成String类型,并且属性名要和Json数据中的键值对的键名完全一样

     private String age;

     ...//提供所有属性的getter和setter方法

 }

  2、创建GSON对象并解析:

 String jsonData = "{\"name\":\"John\", \"age\":20}";  //注:这里也可以不使用转义字符,而用单引号:String jsonData = "{'name':'John', 'age':20}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonData,Person.class);

  3、然后使用Person对象的getter方法就可以获取到数据了。

  4、扩展:考虑到Json数据的不同,那么解析Json的时候所用的类也可能不同,比如这里用的是Person,如果解析其他数据可能用的又是Dog、Cat...所以考虑将用GSON解析的步骤封装,并提供泛型参数,示例程序如下:

 import com.google.gson.Gson;

 /**
* 用GSON解析单条Json数据
*
*/
public class GsonTest1 {
public static void main(String[] args) {
String jsonData = "{'name':'John', 'age':20}";
Person person = GsonUtil.parseJsonWithGson(jsonData, Person.class);
System.out.println(person.getName() + "," + person.getAge());
}
} /*
* 封装的GSON解析工具类,提供泛型参数
*/
class GsonUtil {
//将Json数据解析成相应的映射对象
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
} } class Person {
private String name;
private String age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} }

输出结果:

John,20

  (二)单条有嵌套的Json数据解析

  比如有如下Json数据:{"name":"John", "age":20,"grade":{"course":"English","score":100,"level":"A"}}

  对这样的数据就要用内部类的来解决了。解析步骤如下:

  1、定义Student类:

 class Student {
private String name;
private String age; private Grade grade; public class Grade { // 内部类要定义成public的
private String course;
private String score;
private String level; public String getCourse() {
return course;
} public void setCourse(String course) {
this.course = course;
} public String getScore() {
return score;
} public void setScore(String score) {
this.score = score;
} public String getLevel() {
return level;
} public void setLevel(String level) {
this.level = level;
} // 重写toString方法
@Override
public String toString() {
return "Grade:[course = " + course + ", score = " + score
+ ", level = " + level + "]";
}
} // 重写toString方法
@Override
public String toString() {
return "Student:[name = " + name + ", age = " + age + ", grade = "
+ grade + "]";
}
}

  2、使用(一)中封装的GsonUtil工具类进行解析:

 public class GsonTest1 {
public static void main(String[] args) {
String jsonData = "{'name':'John', 'age':20,'grade':{'course':'English','score':100,'level':'A'}}";
Student student = GsonUtil.parseJsonWithGson(jsonData, Student.class);
System.out.println(student);
}
} /*
* 封装的GSON解析工具类,提供泛型参数
*/
class GsonUtil {
// 将Json数据解析成相应的映射对象
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
} }

输出结果:

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。步骤如下:

  示例程序如下:

 import java.lang.reflect.Type;
import java.util.List; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; /**
* 用GSON解析Json数组
*/
public class GsonTest {
public static void main(String[] args) {
// Json数组最外层要加"[]"
String jsonData = "[{'name':'John', 'grade':[{'course':'English','score':100},{'course':'Math','score':78}]},{'name':'Tom', 'grade':[{'course':'English','score':86},{'course':'Math','score':90}]}]"; List<Student> students = GsonUtil.parseJsonArrayWithGson(jsonData,
Student.class);
System.out.println(students);
}
} /*
* 封装的GSON解析工具类,提供泛型参数
*/
class GsonUtil {
// 将Json数据解析成相应的映射对象
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
} // 将Json数组解析成相应的映射对象列表
public static <T> List<T> parseJsonArrayWithGson(String jsonData,
Class<T> type) {
Gson gson = new Gson();
List<T> result = gson.fromJson(jsonData, new TypeToken<List<T>>() {
}.getType());
return result;
}
} class Student {
private String name;
private List<Grade> grade; // 因为grade是个数组,所以要定义成List public class Grade {
private String course;
private String score; public String getCourse() {
return course;
} public void setCourse(String course) {
this.course = course;
} public String getScore() {
return score;
} public void setScore(String score) {
this.score = score;
} } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<Grade> getGrade() {
return grade;
} public void setGrade(List<Grade> grade) {
this.grade = grade;
}
}

输出结果:

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

随机推荐

  1. linux下独立core2.1部署发布过程

    1.vs2017独立发布.linux-64 2.winscp上传到当前用户下面.ubuntu tsl64来讲 3.超级用户sudo su 4.zip解压缩 uzip xxx.zip -d ../../ ...

  2. 我的第六个java程序 spring-bean

    配置文件 Beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  3. git Staging Deleted files

    Use git rm foo to stage the file for deletion. (This will also delete the file from the file system, ...

  4. php文件加密

    1.在线加密 网址:http://www.phpjm.net/encode.html 本人测试过还可以,就是纯加密,没有解密.

  5. RAC中数据文件创建到了本地路径(非系统表空间) 使用rman转移

    环境: 11.2.0.1 + RHEL5.8 參考文档ID:1678747.1 1.模拟创建 一节点: SQL> create tablespace tdb datafile '/u02/app ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记1.3

    想命令行执行gradle的构建,可以通过提供的gradle wrapper或者安装gradle. 构建android项目不需要安装gradle,因为android studio已经包含gradle.& ...

  7. 《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用

    原创文章,欢迎转载.转载请注明:关东升的博客 参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以 ...

  8. LIS(模板)

    记录一下,O(nlgn)的算法求LIS //HHH #include <iostream> #include <stdio.h> #include <string.h&g ...

  9. delphi 中配置文件的使用(*.ini)和TIniFile 用法

    一.配置文件 .ini 文件是基于文本类型的格式文件,用于存储程序初始化和配置数据. .ini文件是有段(Sections)和键(key)组成的,每个文件可以有 n个段(每个段有方括号括起来),每个段 ...

  10. 第六课作业——主从复制和sentinel高可用

    第六课时作业 静哥 by 2016.3.21~2016.4.3   [作业描述] 1.配置主从复制,截图看日志 2.配置一个哨兵,一主一从结构,并实现主宕机从接管的过程,截图显示 3.总结哨兵的原理 ...