GSON使用的学习笔记,入门篇
2013-11-08 23:34
417 查看
今天是我第一次处理json编、解码,也是第一次使用gson,这里记录一些学习中的笔记。
百度百科里有个词条介绍了json,这里就不重复说明了。重点是json在web的javascript编程中应用非常多,使用时非常灵活、方便。json的格式很简单,大致上可以如下概括,{和}表示对象,[和]表示数组,加上名、值对,组成了json的格式。
首先是Java Bean的定义,为了简化定义,样例中使用了lombok来生成get/set以及toString、hashCode、equals方法。
下面是编码和解码的过程。
如前述,样例很简单,应当不需要注释说明。如下是上述代码的执行结果。
上述样例代码的输出如下。
从样例代码中可以得出一个简单的结论,解析数组形式的json串然后生成对象时,只要把fromJson方法的第二个参数调整为对象的数组类的类型即可。这是一个简单的原则。
改进后的Person类。
处理解码和编码的样例代码,如下。
样例输出如下。
观察样例的输出信息,可以得出一些有意思的结论。
1、当成员包含有意义的字段时,生成的json串中将会看到成员的内部字段被 {}包括起来,比如对象Person(name=Jackie, age=30, contact=Contact(email=email, phoneno=phoneno)),对应的json串为{"name":"Jackie","age":30,"contact":{"email":"email","phoneno":"phoneno"}}。
2、当成员不为null,但其内部没有有意义的字段时,对象的json串中将会使用 {} 来表示对应的成员,比如对象Person(name=Jackie Boy, age=1, contact=Contact(email=null, phoneno=null)),其对应的json串为{"name":"Jackie Boy","age":1,"contact":{}}。
3、当成员为null时,对象的json串中将不包含对应的成员信息,比如对象Person(name=Jackie Mom, age=1, contact=null),对应的json串为{"name":"Jackie Mom","age":1}。
代码的执行输出如下。
如下是对Map类型的处理。
代码的输出如下。
对比之下可以发现,gson在处理Map类型时,不需要专门定义类型适配器来做类型转换,算是一个优点吧。
======================================
如下是牢骚,和技术无关。
======================================
最近项目里需要和一个新产品对接,看到接口文档的时候,我和小伙伴们都震惊了。对方给出的接口文档里提出使用SOAP来完成业务上的方法调用,但数据使用json格式描述,这使我不得不承认人类的想像力是多么的丰富。以前使用SOAP的时候场景是比较简单的,借助Apache Axis 1.4工具,先用Java原生的接口和Bean定义好Java类,然后使用工具对Java类进行处理,生成对应的WSDL,最后分别生成客户端和服务器端的编、解码的存根和框架库,其余的事情就是实现服务端或者调用客户端了。现在做的事情稍复杂点,过程是类似的,只是接口调用后拿到的字段是json格式描述的,使用时还需要根据接口文档描述,写代码解析出业务相关的信息,进而根据这些信息完成业务逻辑实现。也许是对方产品的业务场景比复杂吧,导致他们养成了定义类似这种接口的习惯。
最近感觉整个人比较懒,可能是进入了新的迷茫期吧,遇到没有使用过的技术时钻研的动力不足。不过好在json技术比较成熟,可供选择的开源软件非常多,使用都比较简单。我在项目里应用的是gson.jar,文档和能力都让我非常满意。在短暂的学习与尝试,这个过程大约有一个小时吧,又花了一个小时完成了项目特性的开发,总体而言没有让我费太大的力气,反倒是钻研接口文档花了不少时间。
json是什么
看到 { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" } 这样的字符串时,不由的让我想起几年前看过一本讲述javascript编程的书籍,前言里提到javascript世界里对对象的定义,非常简短,但富有内涵,翻译之后为“对象是名、值对的组合”。这是json给我的第一感觉。百度百科里有个词条介绍了json,这里就不重复说明了。重点是json在web的javascript编程中应用非常多,使用时非常灵活、方便。json的格式很简单,大致上可以如下概括,{和}表示对象,[和]表示数组,加上名、值对,组成了json的格式。
简单入门
下面的代码演示了非常简单的场景,包含一个简单的Java Bean和使用gson进行编码和解码的操作。首先是Java Bean的定义,为了简化定义,样例中使用了lombok来生成get/set以及toString、hashCode、equals方法。
@Data class Person { private String name; private int age; }
下面是编码和解码的过程。
import lombok.Data; import com.google.gson.Gson; public class JsonTest { public static void main(final String[] args) { final Gson gson = new Gson(); final Persion jack = new Person(); jack.setAge(222); jack.setName("Jackie"); final String json = gson.toJson(jack); final Person jack2 = gson.fromJson(json, Person.class); System.out.println(jack.equals(jack2)); System.out.println("jack = " + jack); System.out.println("jack2 = " + jack2); System.out.println(json); } }
如前述,样例很简单,应当不需要注释说明。如下是上述代码的执行结果。
true jack = Person(name=Jackie, age=222) jack2 = Person(name=Jackie, age=222) {"name":"Jackie","age":222}
进阶一,处理数组
比如面对类似 [{"name":"Jackie","age":30},{"name":"Jackie Boy","age":1}] 这样的json格式的字符串需要解析处理,这时该如何处理?解决方法见下面的样例代码。import lombok.Data; import com.google.gson.Gson; public class JsonTest { public static void main(final String[] args) { final Gson gson = new Gson(); final Person jack1 = new Person(); jack1.setAge(30); jack1.setName("Jackie"); final Person jack2 = new Person(); jack2.setAge(1); jack2.setName("Jackie Boy"); final String json = gson.toJson(new Person[] { jack1, jack2 }); System.out.println(json); final Person[] jacks = gson.fromJson(json, Person[].class);// 这里的语法很有意思,平时很难想到这样写也可以通过编译 for (final Person person : jacks) { System.out.println("jack = " + person); } } }
上述样例代码的输出如下。
[{"name":"Jackie","age":30},{"name":"Jackie Boy","age":1}] jack = Person(name=Jackie, age=30) jack = Person(name=Jackie Boy, age=1)
从样例代码中可以得出一个简单的结论,解析数组形式的json串然后生成对象时,只要把fromJson方法的第二个参数调整为对象的数组类的类型即可。这是一个简单的原则。
进阶二,处理复杂对象
前面的样例中,用于测试的Person类成员都是简单类型,没有包含其它自定义的成员。下面给出的样例中会为Person类增加表示联系方式的成员,这个成员是一个自定义的对象,看看会有什么不同。改进后的Person类。
@Data class Person { private String name; private int age; private Contact contact; } @Data class Contact { private String email; private String phoneno; }
处理解码和编码的样例代码,如下。
import lombok.Data; import com.google.gson.Gson; public class JsonTest { public static void main(final String[] args) { final Gson gson = new Gson(); final Person jack1 = new Person(); jack1.setAge(30); jack1.setName("Jackie"); final Contact contact = new Contact(); contact.setEmail("email"); contact.setPhoneno("phoneno"); jack1.setContact(contact); final Person jack2 = new Person(); jack2.setAge(1); jack2.setName("Jackie Boy"); jack2.setContact(new Contact()); final Person jack3 = new Person(); jack3.setAge(1); jack3.setName("Jackie Mom"); final String json = gson.toJson(new Person[] { jack1, jack2, jack3 }); System.out.println(json); final Person[] jacks = gson.fromJson(json, Person[].class); for (final Person person : jacks) { System.out.println("jack = " + person); } } }
样例输出如下。
[{"name":"Jackie","age":30,"contact":{"email":"email","phoneno":"phoneno"}},{"name":"Jackie Boy","age":1,"contact":{}},{"name":"Jackie Mom","age":1}] jack = Person(name=Jackie, age=30, contact=Contact(email=email, phoneno=phoneno)) jack = Person(name=Jackie Boy, age=1, contact=Contact(email=null, phoneno=null)) jack = Person(name=Jackie Mom, age=1, contact=null)
观察样例的输出信息,可以得出一些有意思的结论。
1、当成员包含有意义的字段时,生成的json串中将会看到成员的内部字段被 {}包括起来,比如对象Person(name=Jackie, age=30, contact=Contact(email=email, phoneno=phoneno)),对应的json串为{"name":"Jackie","age":30,"contact":{"email":"email","phoneno":"phoneno"}}。
2、当成员不为null,但其内部没有有意义的字段时,对象的json串中将会使用 {} 来表示对应的成员,比如对象Person(name=Jackie Boy, age=1, contact=Contact(email=null, phoneno=null)),其对应的json串为{"name":"Jackie Boy","age":1,"contact":{}}。
3、当成员为null时,对象的json串中将不包含对应的成员信息,比如对象Person(name=Jackie Mom, age=1, contact=null),对应的json串为{"name":"Jackie Mom","age":1}。
进阶三,处理容器
容器的处理比较简,有了前述的使用经验,相信这部分代码不需要再做详细的说明。下面是对List类型的处理,唯一看起来复杂的地方即是使用TypeAdapter生成了泛型的类型对象,原理比较复杂,不过实地使用时,照猫画虎即可。import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
import lombok.Data;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class JsonTest {
public static void main(final String[] args) {
final Gson gson = new Gson();
final Person jack1 = new Person();
jack1.setAge(30);
jack1.setName("Jackie");
final Contact contact = new Contact();
contact.setEmail("email");
contact.setPhoneno("phoneno");
jack1.setContact(contact);
final Person jack2 = new Person();
jack2.setAge(1);
jack2.setName("Jackie Boy");
jack2.setContact(new Contact());
final Person jack3 = new Person();
jack3.setAge(1);
jack3.setName("Jackie Mom");
final String json = gson.toJson(Arrays.asList(jack1, jack2, jack3));
System.out.println(json);
final Type personListType = new TypeToken<List<Person>>() {
}.getType();
final List<Person> jacks = gson.fromJson(json, personListType);
for (final Person person : jacks) {
System.out.println("jack = " + person);
}
}
}
@Data class Person { private String name; private int age; private Contact contact; } @Data class Contact { private String email; private String phoneno; }
代码的执行输出如下。
[{"name":"Jackie","age":30,"contact":{"email":"email","phoneno":"phoneno"}},{"name":"Jackie Boy","age":1,"contact":{}},{"name":"Jackie Mom","age":1}] [{"name":"Jackie","age":30,"contact":{"email":"email","phoneno":"phoneno"}},{"name":"Jackie Mom","age":1}] jack = Person(name=Jackie, age=30, contact=Contact(email=email, phoneno=phoneno)) jack = Person(name=Jackie Mom, age=1, contact=null)
如下是对Map类型的处理。
import java.lang.reflect.Type; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import lombok.Data; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class JsonTest { public static void main(final String[] args) { final Gson gson = new Gson(); final Person jack1 = new Person(); jack1.setAge(30); jack1.setName("Jackie"); jack1.putValue("email", "email"); jack1.putValue("phoneno", "phoneno"); final Person jack2 = new Person(); jack2.setAge(1); jack2.setName("Jackie Boy"); final Person jack3 = new Person(); jack3.setAge(1); jack3.setName("Jackie Boy"); final Contact contacts = new Contact(); contacts.setEmail("email"); contacts.setPhoneno("phoneno"); jack3.putValue("contacts", contacts); final String json = gson.toJson(Arrays.asList(jack1, jack2, jack3)); System.out.println(json); final Type personListType = new TypeToken<List<Person>>() { }.getType(); final List<Person> jacks = gson.fromJson(json, personListType); for (final Person person : jacks) { System.out.println("jack = " + person); } } } @Data class Person { private String name; private int age; private Map<String, Object> contact; // private Contact contact; public Person() { contact = new HashMap<String, Object>(); } public void putValue(final String key, final Object value) { contact.put(key, value); } } @Data class Contact { private String email; private String phoneno; }
代码的输出如下。
[{"name":"Jackie","age":30,"contact":{"email":"email","phoneno":"phoneno"}},{"name":"Jackie Boy","age":1,"contact":{}},{"name":"Jackie Boy","age":1,"contact":{"contacts":{"email":"email","phoneno":"phoneno"}}}] jack = Person(name=Jackie, age=30, contact={email=email, phoneno=phoneno}) jack = Person(name=Jackie Boy, age=1, contact={}) jack = Person(name=Jackie Boy, age=1, contact={contacts={email=email, phoneno=phoneno}})
对比之下可以发现,gson在处理Map类型时,不需要专门定义类型适配器来做类型转换,算是一个优点吧。
======================================
如下是牢骚,和技术无关。
======================================
最近项目里需要和一个新产品对接,看到接口文档的时候,我和小伙伴们都震惊了。对方给出的接口文档里提出使用SOAP来完成业务上的方法调用,但数据使用json格式描述,这使我不得不承认人类的想像力是多么的丰富。以前使用SOAP的时候场景是比较简单的,借助Apache Axis 1.4工具,先用Java原生的接口和Bean定义好Java类,然后使用工具对Java类进行处理,生成对应的WSDL,最后分别生成客户端和服务器端的编、解码的存根和框架库,其余的事情就是实现服务端或者调用客户端了。现在做的事情稍复杂点,过程是类似的,只是接口调用后拿到的字段是json格式描述的,使用时还需要根据接口文档描述,写代码解析出业务相关的信息,进而根据这些信息完成业务逻辑实现。也许是对方产品的业务场景比复杂吧,导致他们养成了定义类似这种接口的习惯。
最近感觉整个人比较懒,可能是进入了新的迷茫期吧,遇到没有使用过的技术时钻研的动力不足。不过好在json技术比较成熟,可供选择的开源软件非常多,使用都比较简单。我在项目里应用的是gson.jar,文档和能力都让我非常满意。在短暂的学习与尝试,这个过程大约有一个小时吧,又花了一个小时完成了项目特性的开发,总体而言没有让我费太大的力气,反倒是钻研接口文档花了不少时间。
相关文章推荐
- GSON使用的学习笔记,入门篇
- GSON使用的学习笔记,入门篇
- GSON使用的学习笔记,入门篇
- Netty5入门学习笔记004-使用Netty传输POJO对象(上)
- 韩顺平_php从入门到精通_视频教程_第13讲_选择器使用细节_块元素和行内元素_盒子模型_盒子模型经典应用①_学习笔记_源代码图解_PPT文档整理
- Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs
- Scala入门学习笔记四--List使用
- Docker学习笔记1:入门使用
- GSON使用的学习笔记,进阶篇(三)
- [Kotlin&Anko开发Android入门学习笔记]-01使用Kotlin创建Activity活动
- Maven学习笔记(八)Maven的入门使用—2. 编写主代码
- Python Web开发 之Django框架入门学习笔记(一)——安装和初步使用
- [cocos2d-x学习笔记][入门基础]Box-2d物理引擎的使用01
- android 入门学习笔记 LayoutInflater的使用
- 学习笔记-[Maven实战]-第三章:Maven使用入门(1)
- felx 入门学习笔记之6 List控件使用
- Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
- [cocos2d-x学习笔记][入门基础]Box-2d物理引擎的使用02制作一个简易的愤怒小鸟Demo
- 【安全牛学习笔记】python使用入门
- C# 2010 从入门到精通 学习笔记8 第9章 使用枚举和结构来创建值类型