【Android开发经验】超好用的json解析工具——Gson项目使用详解
来源:互联网 发布:设置铃声的软件 编辑:程序博客网 时间:2024/05/20 05:55
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992
在上一篇文章中,我们简单的介绍了json数据格式,并介绍了如何使用Android自带的json工具,完成json数据的生成与解析。但是就像我所说的,自带的工具类太难用了!因此这篇文章,会介绍一个json解析的非常好的工具,那就是google的开源项目Gson。
咱们这次不介绍Gson里面的常用类了,因为常用的几个类非常的简单,我们直接上手开始用,看看Gson是多么的强大!
当然,如果使用第三方的项目,我们肯定要导入jar包了,百度一搜一大把哈。
先给出测试的Model代码
- <span style="font-size:18px;">package com.example.jsondemo;
- public class Person {
- private String name;
- private int age;
- private Birthday birthday;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Birthday getBirthday() {
- return birthday;
- }
- public void setBirthday(Birthday birthday) {
- this.birthday = birthday;
- }
- public Person() {
- super();
- }
- public Person(String name, int age, Birthday birthday) {
- super();
- this.name = name;
- this.age = age;
- this.birthday = birthday;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + ", birthday="
- + birthday + "]";
- }
- }</span>
为了让构造的对象更加复杂,所以定义了这个类,这样person类的属性就不只有基本数据类型了,让我们的测试更有代表性。
- package com.example.jsondemo;
- /**
- *
- * @ClassName: com.example.jsondemo.Birthday
- * @Description: 生日类
- * @author zhaokaiqiang
- * @date 2014-11-26 上午10:29:47
- *
- */
- public class Birthday {
- private int year;
- private int month;
- private int day;
- public int getYear() {
- return year;
- }
- public void setYear(int year) {
- this.year = year;
- }
- public int getMonth() {
- return month;
- }
- public void setMonth(int month) {
- this.month = month;
- }
- public int getDay() {
- return day;
- }
- public void setDay(int day) {
- this.day = day;
- }
- public Birthday() {
- super();
- }
- public Birthday(int year, int month, int day) {
- super();
- this.year = year;
- this.month = month;
- this.day = day;
- }
- @Override
- public String toString() {
- return "Birthday [year=" + year + ", month=" + month + ", day=" + day
- + "]";
- }
- }
1.Object与Json的相互转换
咱们先从最简单的单一对象开始说。
下面是代码实现
- <span style="font-size:18px;">/**
- * 单一对象的json生成与解析
- */
- public void objectToJson() {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- Gson gson = new Gson();
- String jsonString = gson.toJson(p);
- Log.d(TAG, "---------单一对象生成--------");
- Log.d(TAG, jsonString);
- Person person = gson.fromJson(jsonString, Person.class);
- Log.d(TAG, "---------单一对象解析--------");
- Log.d(TAG, person.toString());
- }</span>
这代码是多么的简洁,美观啊!
在上一篇的文章中,如果要生成简单对象的话,我们还需要自己指定key,然后设置value,自从用了Gson,我们再也没有这些烦恼了!而且为了说明Gson的强大之处,我还特意给Person设置了一个对象Birthday,如果使用自带的json工具,那不就麻烦死了。但是使用Gson,根本不需要有这些顾虑。看下面的转换结果,一个toJson(),完全解决问题,太棒了!
- <span style="font-size:18px;">11-26 16:16:38.392: D/GsonTest(16931): ---------单一对象生成--------
- 11-26 16:16:38.392: D/GsonTest(16931): {"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}
- 11-26 16:16:38.392: D/GsonTest(16931): ---------单一对象解析--------
- 11-26 16:16:38.392: D/GsonTest(16931): Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]</span>
2.集合泛型与Json的相互转换
Gson除了可以很方便的与单一对象进行转换之外,还能够与集合进行转换。
下面是一个生成Json,并完成解析的代码:
- /**
- * 集合对象的json生成与解析
- */
- public void objectsToJson() {
- Gson gson = new Gson();
- Person person = new Person("zhaokaiqiang", 22,
- new Birthday(1992, 1, 19));
- ArrayList<Person> arrayList = new ArrayList<Person>();
- arrayList.add(person);
- arrayList.add(person);
- arrayList.add(person);
- String jsonString = gson.toJson(arrayList);
- Log.d(TAG, "---------集合对象生成--------");
- Log.d(TAG, jsonString);
- Type type = new TypeToken<ArrayList<Person>>() {
- }.getType();
- ArrayList<Person> persons = gson.fromJson(jsonString, type);
- Log.d(TAG, "---------集合对象解析--------");
- Log.d(TAG, persons.toString());
- }
这是转换出来的结果
- <span style="font-size:18px;">---------集合对象生成--------
- [{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}]
- ---------集合对象解析--------
- [Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]]
- </span>
如果我们想使用json完成类似的功能,复杂度是不可想象的,但是使用Gson来实现的话,却是如此简单。
在使用Gson.toJson()方法的时候,我们可以把任何对象或者是集合放进去,就可以完美的转换成json格式。
如果想把json格式的数据转换成我们想要的对象,我们只需要调用Gson.fromJson()即可。
但是在转换的时候,第二个参数有两种形式,一种是Class<?>,这个是转换单一对象的时候,我们需要把对象.class传递进去,告诉转换器要转换的类型。如果我们需要转换的是集合类型,我们需要传递一个实现了Type接口的实例,具体语法就和上面的代码一样,只要把你用的集合类型还有具体的对象换一下就可以了。
------------------------------------------------------------分割线------------------------------------------------------------------
以上的内容是最简单的Gson的用法,我们基本上只使用到了Gson这一个类,对于基本需求来说没问题,
但是,如果想要创建和解析复杂的Json数据,就有点不够了。为了说明如何使用Gson解析更加复杂的数据,
特添加以下内容,即Gson的更高级用法
------------------------------------------------------------分割线--------------------------------------------------------------------
3.复杂json数据结构的构建与解析
我们首先看看如何构建复杂的Json数据。
上一篇文章中,我们已经知道Json数据有两种形式,Object形式(其实就是键值对形式),Array形式(即数组形式),我们以Object形式为例,介绍构建复杂Json。
在开始构造之前,我们需要先介绍几个常用对象。
Gson:这个类在前面已经用过了,是我们完成json转换和解析的主要类,主要使用toJson()和fromJson()这两个方法。
JsonObject:这个是我们构建Object形式的Json数据的主要类,我们可以设置key和value。
JsonElement:这个是Json元素类,它里面可以是一个JsonObject、JsonArray、JsonNull或者是一个JsonPrimitive。注意,它里面的数据只能看作是一个元素。
JsonArray:这个是我们想构造Array形式的主要类,我们可以往数组里面添加数据,数据是有序的。
JsonParser:这个是Json的解析器,主要作用是把一个Json形式的字符串转换成一个JsonElement对象。
介绍完这些常用对象之后,我们下面看一下代码实现吧。
- public String getJsonString() {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- JsonElement jsonElement = new JsonParser().parse(new Gson().toJson(p));
- JsonObject jsonObject = new JsonObject();
- jsonObject.addProperty("name", "zhao");
- jsonObject.addProperty("age", 22);
- jsonObject.add("person", jsonElement);
- Log.d(TAG, "getJsonString------" + jsonObject.toString());
- return jsonObject.toString();
- }
下面是输出的结果,没有任何问题。
- getJsonString------{"name":"zhao","age":22,"person":{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}}
知道了如何使用上面的这些类实现Json数据构建之后,下面我们讲解一下如何解析上面的这种复杂的json数据。
我们先看代码吧
- public void fromJsonString() {
- Gson gson = new Gson();
- JsonElement jsonElement = new JsonParser().parse(getJsonString());
- JsonObject jsonObject = jsonElement.getAsJsonObject();
- JsonElement personElement = jsonObject.get("person");
- Person person = gson.fromJson(personElement, Person.class);
- JsonElement nameElement = jsonObject.get("name");
- String name = nameElement.getAsString();
- JsonElement ageElement = jsonObject.get("age");
- int age = ageElement.getAsInt();
- Log.d(TAG, "person-----" + person);
- Log.d(TAG, "name-----" + name);
- Log.d(TAG, "age-----" + age);
- }
如果我们要进行解析,我们必须获取到JsonElement对象,然后转换成JsonObject对象之后才能继续处理,所以在代码中进行了这样的处理。因为JsonElement是我们处理的基本元素,所以在获取到JsonObject之后,我们还需要根据key获取到对应value的JsonElement对象,然后根据不同的类型进行不同的转换即可。
知道了这些之后,完成80%的业务需求应该没问题了。
休息,休息一下...
- 【Android开发经验】超好用的json解析工具——Gson项目使用详解
- 【Android开发经验】超好用的json解析工具——Gson项目使用详解
- 超好用的json解析工具——Gson项目使用详解
- 超好用的json解析工具——Gson项目使用详解
- 超好用的json解析工具——Gson项目使用详解
- 【Android开发经验】比Gson解析速度快10倍!——Json解析神器Jackson使用介绍
- 【Android开发经验】比Gson解析速度快10倍!——Json解析神器Jackson使用介绍
- Android应用之——谷歌官方Json解析工具Gson的使用
- Android 使用Gson解析json案例详解
- Android 使用Gson解析json案例详解
- Android 使用Gson解析json案例详解
- json解析工具:Gson的使用
- json——Android Gson解析json详解
- Android Gson解析json详解
- Android Gson解析json详解
- Android使用gson解析json
- android:json解析的两个工具:Gson和Jackson的使用小例子
- android中json解析的两个工具:Gson和Jackson的使用小demo
- 2015多校联合第十场hdu5410CRB and His Birthday 01背包+完全背包
- 有关eigen库在qt中的使用
- JAVA泛型
- 网页源码保存为文件
- CodeForces 题目191C. Fools and Roads(Link Cut Tree,边权加求边权值)
- 【Android开发经验】超好用的json解析工具——Gson项目使用详解
- AX 2009 删除已经发出领料单的订单行
- 华为OJ(MP3光标移动)
- 经典任务调度算法的模拟程序
- 数组和指针内存分配示例代码
- Makefile经典教程(掌握这些足够)
- 架构师不是演员,是管家
- Util:ImageLoad图片缩放处理
- ios学习计划