完全理解Gson(1):简单入门
GSON是Google开发的Java API,用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问:http://sites.google.com/site/gson/.

本文是GSON系列文章的第一篇。本文是其他文章的基础,因此不需要任何GSON或JSON经验。第二篇文章提供了关于GSON反序列化(从JSON到Java)的示例,第三篇文章提供了关于GSON序列化(从Java到JSON)的示例。
下面列出的所有代码都可以在https://java-creed-examples.googlecode.com/svn/gson/Simple%20Gson%20Example. 找到。绝大部分示例都不会包含全部的代码,可能会忽略一些片段,这些片段都与讨论的示例无关。读者可以从上面的链接下载或查阅所有代码。
读者需要有基础的Java(教程)知识和很基础的Maven(首页)知识。这里展示的代码使用maven来下载GSON库。把项目导入到Springsource Tool Suite(推荐的IDE),无需任何配置。
下载与安装
在使用GSON API工作之前,你需要下载库(jar文件),并将其包含到类路径中。库,连同源代码和Java文档,都可以从http://code.google.com/p/google-gson/downloads/list下载。下载完毕后,添加gson-<version>.jar到类路径。对于那些偏好使用Maven管理依赖(JAR文件)的读者,添加如下依赖到pom.xml。
|
1
2
3
4
5
|
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.2.4</version></dependency> |
需要修改 <version>2.2.4</version>。本文所有代码示例使用上面列出的版本。pom.xml文件拷贝可以在这里找到。
如果这个库用于web应用,请确保在WEB-INF/lib文件夹中保持一份拷贝。或者,GSON库可以放到应用服务器提供给web应用。
一个简单示例
GSON API提供一个类文件,Gson(Java文档),它被用来处理Java和JSON对象的转换。可以调用默认构造器,或如下代码的形式,使用GsonBuilder(Java文档)类创建这个类的实例。GsonBuilder类是可定制化的,并且允许开发者按需实例化Gson。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.javacreed.examples.gson.part1;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class SimpleExample1 { public static void main(String[] args) { Gson gson = new GsonBuilder().create(); gson.toJson("Hello", System.out); gson.toJson(123, System.out); }} |
在上面的例子中,我们创建了一个Gson实例,并把Java String和int转化为JSON对象。以上代码命令行里的输出结果如下:
|
1
|
"Hello"123 |
这不是火箭科学,但它是一个开始。注意,上述的结果都将输入到命令行。该toJason()方法有两个参数,Java对象转换为JSON和可追加(Java的文档)的一个实例。我们可以很容易地改变了一个文件或网络流。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.javacreed.examples.gson.part1;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class SimpleExample2 { public static void main(String[] args) throws IOException { Writer writer = new FileWriter("Output.json"); Gson gson = new GsonBuilder().create(); gson.toJson("Hello", writer); gson.toJson(123, writer); writer.close(); }} |
注意
为什么变量声明为Writer类型,而实际类型是FileWriter?
尽量使用泛型是一个很好的方法。在上例中,我们只使用了Appendable和Writer接口定义的方法。使用泛型使代码更易于移植和维护,下面是个不好的例子。
注意,上面例子中,我们没有正确处理流(Writer)。理想情况下,资源在finaly块 (教程) 中关闭或者用在try-with-resource(教程)中。我们忽略了这个是为了保持代码简洁。
|
1
2
3
4
5
6
7
|
public static void main(String[] args) throws IOException { try (Writer writer = new FileWriter("Output.json")) { Gson gson = new GsonBuilder().create(); gson.toJson("Hello", writer); gson.toJson(123, writer); }} |
以上代码生成文件:包含JSON对象的Output.json。注意,这里我们使用了字符流而不是字节流。因为toJson()方法需要一个Appendanble实例,而字节流不能实现Appendable接口,所以我们使用了字符流。Appendable接口处理字符而不是字节。Java提供了InputStreanReader(Java文档)和OutputStreamWriter(Java文档)类进行字节流与字符流的转换,如下面的例子。
注意
注意,使用InputStreamREader和OutputStreamWriter类时,如果不提供编码或者字符集,转换将使用平台默认字符集。这将降低代码的可移植性,且在其他平台上运行将可能产生错误行为。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.javacreed.examples.gson.part1;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.Writer;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class SimpleExample3 { public static void main(String[] args) throws IOException { try(Writer writer = new OutputStreamWriter(new FileOutputStream("Output.json") , "UTF-8")){ Gson gson = new GsonBuilder().create(); gson.toJson("Hello", writer); gson.toJson(123, writer); } }} |
如你所见,我们只需要改变实例的一部分。代码的剩余部分没有任何变化。这就是使用接口代替类作为变量类型的好处之一。
使用JSON对象
比方说,我们需要使用JSON对象并加载他们为Java对象。假设web服务器查询时产生如下JSON对象:
|
1
2
3
4
5
|
{ NAME:"Albert Attard", P_LANGUAGE:"Java", LOCATION:"Malta"} |
此JSON对象包含3个不同值的域。比如我们需要使用JSON对象并创建一个Java对象来展示它。为了使这个例子更有趣,假设我们只关心name和location域。
首先创建一个Java类来表示name和location。类命名为Person。类的名字无关紧要,但域的名字必须一致。域名必须匹配(大小写敏感)JSON对象中的名字。更进一步,类必须包含一个默认构造函数(即使它被设置为private)。如下所示,name和location域在JSON中是大写的。JSON中域P_LANGUAGE被忽略了,因为Java对象中不包括该名称的域。请理解域名不遵守Java命名规范,暂时只是为了简化。更多内容将在第2部分中讨论。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.javacreed.examples.gson.part2;public class Person { private String NAME; private String LOCATION; // Getters and setters are not required for this example. // GSON sets the fields directly using reflection. @Override public String toString() { return NAME + " - " + LOCATION; }} |
准备好Java对象后,我们可以读取JSON对象并加载为Java对象,如下代码所示。为了模拟真实情况,我们使用了字节流作为输入。还要注意,JSON内容保存在resource文件夹的文件里(这不是常规做法)。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.javacreed.examples.gson.part2;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class JsonToJava { public static void main(String[] args) throws IOException { try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){ Gson gson = new GsonBuilder().create(); Person p = gson.fromJson(reader, Person.class); System.out.println(p); } }} |
输出如下:
|
1
|
Albert Attard - Malta |
Gson解析JSON对象并创建了一个Person类的实例,并打印到命令行中。
嵌套JSON对象
让我们对上面的例子更进一步,以下所示JSON代码段包含了一个嵌套对象。
|
1
2
3
4
5
6
7
8
9
|
{ NAME:"Albert Attard", P_LANGUAGE:"Java", LOCATION:"Malta", EXAM: { SUBJECT:"Programming", GRADE:4.5 }} |
EXAM域由两个域组成,分别是SUBJECT和GRADE。我们需要修改Person类的定义来包含EXAM域,并创建一个新的Java类来表示EXAM,该类包含SUBJECT和GRADE域。
我们首先创建新的类来表示嵌套对象。就像之前讨论那样,类名无关紧要,但是域名必须与JSON中的域名匹配。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.javacreed.examples.gson.part3;public class Exam { private String SUBJECT; private double GRADE; // Getters and setters are not required for this example. // GSON sets the fields directly using reflection. @Override public String toString() { return SUBJECT + " - " + GRADE; }} |
现在我们可以修改Person类,引入一个与JSON中EXAM同名的域,类型为Exam。注意,下面的Person类与前一个<span style=”color: #ff0000;”>位于</span>不同的包。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.javacreed.examples.gson.part3;public class Person { private String NAME; private String LOCATION; private Exam EXAM; @Override public String toString() { return NAME + " - " + LOCATION + " (" + EXAM + ")"; }} |
注意,所需的变化是最小的,因为Gson动态发现(使用反射)类和它的域。本文不包含反射,对于更多关于反射的信息,请参考:Reflection in Action.
最后,让我们尝试新的变化。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.javacreed.examples.gson.part3;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class JsonToJava { public static void main(String[] args) throws IOException { try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server2.json"), "UTF-8")){ Gson gson = new GsonBuilder().create(); Person p = gson.fromJson(reader, Person.class); System.out.println(p); } }} |
JsonToJava类没有做任何改变,因为Gson使用了模型(Person和Exam类)将Json映射成Java。
结论
即使JSON可能是一个新概念,但它十分简单与直接。此外,相比于需要增加标签进行消息/数据转换而不断膨胀的笨重的XML,它因为简单更加流行。需要指出JSON是JavaScript的一个子集,JavaScript将它作为一个完美的方案来进行数据交换,例如网页。GSON API使它更便于使用,即使在这里没有讨论的部分,它也提供了强大的灵活性。
欲了解更多GSON的例子,请移步第2部分,我们会探索更复杂的例子,并讨论如何使用GSON解串器来完全控制反序列化过程。
原文链接: javacreed 翻译: ImportNew.com- liken
译文链接: http://www.importnew.com/16630.html
from: http://www.importnew.com/16630.html
完全理解Gson(1):简单入门的更多相关文章
- Java Json API:Gson使用简单入门
GSON是Google开发的Java API,用于转换Java对象和Json对象.本文讨论并提供了使用API的简单代码示例.更多关于GSON的API可以访问:http://sites.google.c ...
- 完全理解Gson(3):Gson反序列化
完全理解Gson(2):Gson序列化 完全理解Gson(1):简单入门 本文延续前一篇文章,继续介绍简单基本的Gson用法.这篇文章我们将介绍如何将复杂的JSON对象解析为Java对象,其中Java ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- delphi指针简单入门
delphi指针简单入门: 看一个指针用法的例子: 1 var 2 X, Y: Integer; // ...
- 运维自动化之SALTSTACK简单入门
运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
- SpringMVC:学习笔记(1)——理解MVC及快速入门
SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...
- MyBatis学习总结(一)简单入门案例
MyBatis学习总结(一)简单入门案例 主要内容:本文主要通过对数据库中的use表进行增删改查总结mybatis的环境搭建和基本入门使用 一.需要的jar包: 1.核心包 2.依赖包 3.jdbc数 ...
- EChart.js 简单入门
EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart 这个是Visual Studio里的自带控件,使用比 ...
- springboot 学习之路 1(简单入门)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
随机推荐
- Linux文件系统备份dump
常用的备份方式有三种:1.完全备份:把所有数据完全备份下来2.增量备份:以上一次备份的内容作参照3.差异备份:一直以某一个记录点的全备份作参照备份 dump备份工具dump命令:dump -数字 数字 ...
- C++11线程池的实现
什么是线程池 处理大量并发任务,一个请求一个线程来处理请求任务,大量的线程创建和销毁将过多的消耗系统资源,还增加了线程上下文切换开销. 线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程 ...
- UBB/HTML互相转换简单实现源码一览
查看源码,主要用的就是正则匹配,多的不说,直接读码. 资源原地址:在线UBB/HTML转换 效果图如下 以下源码: <!DOCTYPE html> <html lang=" ...
- Android自动化页面测速在美团的实践
背景 随着移动互联网的快速发展,移动应用越来越注重用户体验.美团技术团队在开发过程中也非常注重提升移动应用的整体质量,其中很重要的一项内容就是页面的加载速度.如果发生冷启动时间过长.页面渲染时间过长. ...
- 2018用IDEA搭建SSM框架(Spring+SpringMVC+Mybatis)
使用IDEA搭建ssm框架 环境 工具:IDEA 2018.1 jdk版本:jdk1.8.0_171 Maven版本:apache-maven-3.5.3 Tomcat版本:apache-tomcat ...
- rabbit:Mnesia could not connect to any nodes
环境: rabbitmq集群 2台机器,挂了一台后重启服务,发现在服务启动不了错误如下: 这里rabbit连接不商rabbit02这里这个服务也无法启动 解决办法: rabbitmq默认的数据库位 ...
- 解决python2.x文件读写编码问题
转自: https://xrlin.github.io/%E8%A7%A3%E5%86%B3python2.x%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E7%BC%96 ...
- [ 原创 ] Java基础7--Java反射机制主要提供了以下哪些功能?
AVA反射机制主要提供了以下哪些功能? 在运行时判断一个对象所属的类 在运行时构造一个类的对象 在运行时判断一个类所具有的成员变量和方法 在运行时调用一个对象的方法
- php常见网络攻击及防御方法
常见的Web攻击分为两类:一是利用Web服务器的漏洞进行攻击,如CGI缓冲区溢出,目录遍历漏洞利用等攻击;二是利用网页自身的安全漏洞进行攻击,如SQL注入,跨站脚本攻击等.下面这篇文章主要介绍了PHP ...
- android studio 汉化 个性化 美化 快速操作项目 目录
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 汉化包 百度云盘 下载地址:https://pan.baidu.com/s/1pLjwy ...