转自太阳尚远的博客:http://blog.yeqianfeng.me/2016/03/02/use_gson_to_parse_json/


在我们实际开发中像Json和XML这两种格式的数据是最常见的了,通常需要额外写一些解析工具类来解析这些数据。自己写当然可以啦,但是自己写有自己写的缺点:

  • 一是自己写的没有那么完美
  • 二是自己写解析工具非常耗时耗力,是一件吃力不讨好的事情

既然网上有那么多开源工具可用,我们又何必自己造轮子呢。

今天博主就给大家介绍一款Json解析工具Gson,相信很多小伙伴也都听过它,我就简单介绍一下它的使用。


一、引入Gson到你的项目中去

如果你使用的是eclipse的话,可以去Gson的github上去下载它的jar文件导入到你的项目中去就好了。这里附上Gson的github地址:https://github.com/google/gson

如果你使用的是Android Studio并且使用Gradle的话,那就更简单了,在你的build.gradle文件里添加如下语句:

dependencies {

    compile 'com.google.code.gson:gson:2.4'
}

这样你就把Gson引入到你的项目中去了

二、Gson的使用

将字符串数组转化成 Json 字符串

Gson gson = new Gson();
String[] date {"Sun","Mon","Tus","Wes","Thes","Fri","Sat"};
String dateJson = gson.toJson(date);
System.out.println(dateJson);

输出结果:["Sun","Mon","Tus","Wes","Thes","Fri","Sat"]

将一个集合转化成 Json 字符串

List<Students> students = new ArrayList<>();
Students a = new Students("xiaoming", "anhui", 18);
Students b = new Students("ahan", null, 19);
Students c = new Students("qianfeng", "chaohu", 20);
Students d = new Students("heshang", "changchun", 21);
students.add(a);
students.add(b);
students.add(c);
students.add(d);
String stuJson = gson.toJson(students);
System.out.println(stuJson);
//其中Students类:
public class Students{
public Students(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
}

输出结果:

[
{"name":"xiaoming","address":"anhui","age":18},
{"name":"ahan","age":19},
{"name":"qianfeng","address":"chaohu","age":20},
{"name":"heshang","address":"changchun","age":21}
]

将一个Map集合转化成 Json 字符串

Gson gson = new Gson();
HashMap<String, String> colors = new HashMap<>();
colors.put("BLACK", "#000000");
colors.put("BLUE", "#0234ff");
colors.put("RED", "#2addbf");
colors.put("YELLOW", "#123456");
String colorJson = gson.toJson(colors);
System.out.println(colorJson);

输出结果:{"RED":"#2addbf","BLUE":"#0234ff","BLACK":"#000000","YELLOW":"#123456"}

将一个 Json 字符串转化成 java 对象

String sJson = "{'name':'小和尚','address':'chaohu','age':22}";
Students s = gson.fromJson(sJson, Students.class);
String name = s.getName();
String addr = s.getAddress();
int age = s.getAge();
System.out.println(name + " " + addr + " " + age);

输出结果:小和尚 chaohu 22

将一个 Json 字符串转化成集合

Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, String>>() {}.getType();
Map<String, String> map = gson.fromJson(colorJson, type);
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}

输出结果:

RED:#2addbf
BLUE:#0234ff
BLACK:#000000
YELLOW:#123456

细心的朋友可以发现,这段代码引入了一个Type类型的对象来表示Map集合的类型,注意了哦,这里导入的 Type 类是 importjava.lang.reflect.Type 中的 Type 哦。为什么要使用 TypeToken 呢?原因是由于java的泛型实现机制,使用了泛型的java代码子运行期间其类型会被擦除,我们无法获得泛型的类型,如果如果直接传入XXX.class的话,Gson很可能无法正确的解析出实际的对象。所以这里是这样写的,以后遇到这种的注意一下就行了。

以上这些都是Gson的一些基本用法。Gson不仅能将Json数据解析成Json对应的类对象,还可以将Json数据解析成封装在其他类里面的类对象。比如有如下的一个类:

public class JsonResponse{
private List<Student> student_list;
private List<Teacher> teacher_list; public List<Student> getStudentsList(){
return student_list;
} public List<Teacher> getTeachersList(){
return teacher_list;
}
}

可以看到,在JsonResponse类里面有两个实例变量,分别是Student的集合和Teacher的集合。想象一下现在你如果要从服务器请求数据,服务器返回给你的是一串Json数据,你如何将它们分别解析成Student集合和Teacher集合呢?很简单,你只需要将Student类和Teacher类都设计成与Json数据一一对应的形式,比如:

Json数据如果是这样的:

{
"student_list": [
{
"std_id": "1",
"std_name": "张三",
"std_age": "3",
"std_addr": "合肥",
"std_avatar": "./Public/Uploads/Avatar/9132035730.jpg"
},
{
"std_id": "2",
"std_name": "李四",
"std_age": "3",
"std_addr": "上海",
"std_avatar": "./Public/Uploads/Avatar/9132035730.jpg"
}
]
}

那么你的Student类就设计成这样:

public class Student{
private int std_id;
private String std_name;
private String std_age;
private String std_addr;
private String std_avatar;
//...get方法就不写了
}

注意了,类中的变量名要和Json数据中的键严格一致,包括JsonResponse中的student_list也要和Json数据中开头的那一项名字一样,要不然是解析不出来的,Teacher的做法也一样。然后再将请求的数据直接转化成JsonResponse对象,Gson会根据Json数据的内容自动将其转化成List<Student>或者List<Teacher>

Gson gson = new Gson();
//sJson就是上面那段Json数据
JsonResponse response = gson.fromJson(sJson, JsonResponse.class);
List<Student> students = response.getStudentsList();
for (Student student : students) {
System.out.println(student.getStd_name());
}

往往请求的数据开头可能还会有一些状态码等附加数据,这些也可以一并在JsonResonse类中解析出来。是不是很方便呢~

好啦,Gson的简单使用就介绍这么多啦,当然它还有很多其他更为高级的用法,等着小伙伴们脑洞大开了~~

[转]用Gson来解析Json数据的更多相关文章

  1. gson笔记 解析json数据

    gson中负责json数据解析的类是JsonReader. Json格式有两种结构,一种是对象(键值对的组合,无序),另外一种是数组(值的有序集合). 因此针对这两种格式,JsonReader提供了不 ...

  2. Gson的解析Json数据的两种方式

    转载:https://blog.csdn.net/huplion/article/details/78984977 在线JSON字符串转Java实体类(JavaBean.Entity): https: ...

  3. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  5. Google Gson解析Json数据应用实例

    转自:http://lixigao449778967.blog.163.com/blog/static/24985164201269105928783/ 1.需要的Jar包 1) Google Gso ...

  6. Google中Gson的使用解析json数据-------学习篇

    之前写过一篇Gson解析json数据的基本应用,这里不多说,直接上例子. 有兴趣的可以先阅读下之前那篇,这里附上链接: http://www.cnblogs.com/Ant-soldier/p/632 ...

  7. 通过Gson解析Json数据

    Json是一种数据格式,便于数据传输.存储.交换:Gson是一种组件库,可以把java对象数据转换成json数据格式. gson.jar的下载地址:http://search.maven.org/#s ...

  8. 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

    1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...

  9. Android解析Json数据之Gson解析

    Gson是谷歌官方提供的解析json数据的工具类.json数据的解析能够使用JSONObject和JSONArray配合使用解析数据,可是这样的原始的方法对于小数据的解析还是有作用的,可是陪到了复杂数 ...

随机推荐

  1. hadoop压缩配置

    为何要使用压缩,压缩可以是文件的大小减小很多,节省空间:另外压缩后的文件在传输时更节省带宽. 所需软件: 1)lzo 2)hadoop-lzo 3)maven 安装编译: 1)lzo wget htt ...

  2. Visual Studio宏注释模板

    前言 有时写代码需要写注释的时候 甚是苦恼 写吧 怕麻烦 不写吧 似乎这代码估计自己都看不懂 权衡之下 似乎找一个自动写注释的方法最靠谱 一直在VS下开发 偶尔听人说过有一个宏工具可以帮助开发者快速注 ...

  3. 安装weblogic的步骤10.3.0.0

    一.安装前的注意事项: weblogic在安装前必须要有对应的jdk支持weblogic的运行.所以在安装之前一定要根据本机上安装的jdk来选择安装的weblgoic的什么版本.因为weblogic的 ...

  4. 【搜索引擎Jediael开发4】V0.01完整代码

    截止目前,已完成如下功能: 1.指定某个地址,使用HttpClient下载该网页至本地文件 2.使用HtmlParser解释第1步下载的网页,抽取其中包含的链接信息 3.下载第2步的所有链接指向的网页 ...

  5. jqGrid实现虚拟滚动和合并单元格

    如图: 关键点:1.scroll: 1, //虚拟滚动,解决大数据一次性加载慢的问题,同时解决分页 2.function merge(names)//自定义函数 $(function () { //查 ...

  6. PLSQL实例(游标)

    在PLSQL块中执行SQL语句 A.   数据定义DDL: create,drop,truncate,不能直接执行,truncate执行时只做数据删除,不写日起,不维护索引 在PLSQL块中执行字符串 ...

  7. Apache无法启动解决方案

    Apache无法启动错误原因: 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开 ...

  8. 异常处理 - PHP手册笔记

    PHP代码中所产生的异常可被throw语句抛出,并被catch语句捕获.需要进行异常处理的代码都必须放入try代码块内,每一个try至少要有一个与之对应的catch.当一个异常被抛出时,所在代码块后面 ...

  9. 关于521(nyoj)

    关于521 点击这里 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去. 浏览网页的流年忽然看到了网上有 ...

  10. 常用433MHZ无线芯片性能对比表分享

    常用433M芯片性能对比: 芯片型号 SI4432 CC1101 NRF905 A7102 A7108 输出功率 20dBm 10dBm 10dBm 15dBm 20dBm 功耗 TX:85mA RX ...