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. <dependency>
  2. <groupId>com.google.code.gson</groupId>
  3. <artifactId>gson</artifactId>
  4. <version>2.2.4</version>
  5. </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. package com.javacreed.examples.gson.part1;
  2. import com.google.gson.Gson;
  3. import com.google.gson.GsonBuilder;
  4. public class SimpleExample1 {
  5. public static void main(String[] args) {
  6. Gson gson = new GsonBuilder().create();
  7. gson.toJson("Hello", System.out);
  8. gson.toJson(123, System.out);
  9. }
  10. }

在上面的例子中,我们创建了一个Gson实例,并把Java String和int转化为JSON对象。以上代码命令行里的输出结果如下:

"Hello"123

这不是火箭科学,但它是一个开始。注意,上述的结果都将输入到命令行。该toJason()方法有两个参数,Java对象转换为JSON和可追加(Java的文档)的一个实例。我们可以很容易地改变了一个文件或网络流。

  1. package com.javacreed.examples.gson.part1;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.Writer;
  5. import com.google.gson.Gson;
  6. import com.google.gson.GsonBuilder;
  7. public class SimpleExample2 {
  8. public static void main(String[] args) throws IOException {
  9. Writer writer = new FileWriter("Output.json");
  10. Gson gson = new GsonBuilder().create();
  11. gson.toJson("Hello", writer);
  12. gson.toJson(123, writer);
  13. writer.close();
  14. }
  15. }

注意

为什么变量声明为Writer类型,而实际类型是FileWriter?

尽量使用泛型是一个很好的方法。在上例中,我们只使用了Appendable和Writer接口定义的方法。使用泛型使代码更易于移植和维护,下面是个不好的例子。

注意,上面例子中,我们没有正确处理流(Writer)。理想情况下,资源在finaly块 (教程) 中关闭或者用在try-with-resource(教程)中。我们忽略了这个是为了保持代码简洁。\

  1. public static void main(String[] args) throws IOException {
  2. try (Writer writer = new FileWriter("Output.json")) {
  3. Gson gson = new GsonBuilder().create();
  4. gson.toJson("Hello", writer);
  5. gson.toJson(123, writer);
  6. }
  7. }

以上代码生成文件:包含JSON对象的Output.json。注意,这里我们使用了字符流而不是字节流。因为toJson()方法需要一个 Appendanble实例,而字节流不能实现Appendable接口,所以我们使用了字符流。Appendable接口处理字符而不是字节。Java 提供了InputStreanReader(Java文档)和OutputStreamWriter(Java文档)类进行字节流与字符流的转换,如下面的例子。

注意

注意,使用InputStreamREader和OutputStreamWriter类时,如果不提供编码或者字符集,转换将使用平台默认字符集。这将降低代码的可移植性,且在其他平台上运行将可能产生错误行为。

  1. package com.javacreed.examples.gson.part1;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStreamWriter;
  5. import java.io.Writer;
  6. import com.google.gson.Gson;
  7. import com.google.gson.GsonBuilder;
  8. public class SimpleExample3 {
  9. public static void main(String[] args) throws IOException {
  10. try(Writer writer = new OutputStreamWriter(new FileOutputStream("Output.json") , "UTF-8")){
  11. Gson gson = new GsonBuilder().create();
  12. gson.toJson("Hello", writer);
  13. gson.toJson(123, writer);
  14. }
  15. }
  16. }

如你所见,我们只需要改变实例的一部分。代码的剩余部分没有任何变化。这就是使用接口代替类作为变量类型的好处之一。

使用JSON对象

比方说,我们需要使用JSON对象并加载他们为Java对象。假设web服务器查询时产生如下JSON对象:

  1. {
  2. NAME:"Albert Attard",
  3. P_LANGUAGE:"Java",
  4. LOCATION:"Malta"
  5. }

此JSON对象包含3个不同值的域。比如我们需要使用JSON对象并创建一个Java对象来展示它。为了使这个例子更有趣,假设我们只关心name和location域。

首先创建一个Java类来表示name和location。类命名为Person。类的名字无关紧要,但域的名字必须一致。域名必须匹配(大小写敏 感)JSON对象中的名字。更进一步,类必须包含一个默认构造函数(即使它被设置为private)。如下所示,name和location域在JSON 中是大写的。JSON中域P_LANGUAGE被忽略了,因为Java对象中不包括该名称的域。请理解域名不遵守Java命名规范,暂时只是为了简化。更 多内容将在第2部分中讨论。

  1. package com.javacreed.examples.gson.part2;
  2. public class Person {
  3. private String NAME;
  4. private String LOCATION;
  5. // Getters and setters are not required for this example.
  6. // GSON sets the fields directly using reflection.
  7. @Override
  8. public String toString() {
  9. return NAME + " - " + LOCATION;
  10. }
  11. }

准备好Java对象后,我们可以读取JSON对象并加载为Java对象,如下代码所示。为了模拟真实情况,我们使用了字节流作为输入。还要注意,JSON内容保存在resource文件夹的文件里(这不是常规做法)。

  1. package com.javacreed.examples.gson.part2;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.Reader;
  5. import com.google.gson.Gson;
  6. import com.google.gson.GsonBuilder;
  7. public class JsonToJava {
  8. public static void main(String[] args) throws IOException {
  9. try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){
  10. Gson gson = new GsonBuilder().create();
  11. Person p = gson.fromJson(reader, Person.class);
  12. System.out.println(p);
  13. }
  14. }
  15. }

输出如下:

Albert Attard - Malta

Gson解析JSON对象并创建了一个Person类的实例,并打印到命令行中。

嵌套JSON对象

让我们对上面的例子更进一步,以下所示JSON代码段包含了一个嵌套对象。

  1. {
  2. NAME:"Albert Attard",
  3. P_LANGUAGE:"Java",
  4. LOCATION:"Malta",
  5. EXAM: {
  6. SUBJECT:"Programming",
  7. GRADE:4.5
  8. }
  9. }

EXAM域由两个域组成,分别是SUBJECT和GRADE。我们需要修改Person类的定义来包含EXAM域,并创建一个新的Java类来表示EXAM,该类包含SUBJECT和GRADE域。

我们首先创建新的类来表示嵌套对象。就像之前讨论那样,类名无关紧要,但是域名必须与JSON中的域名匹配。

  1. package com.javacreed.examples.gson.part3;
  2. public class Exam {
  3. private String SUBJECT;
  4. private double GRADE;
  5. // Getters and setters are not required for this example.
  6. // GSON sets the fields directly using reflection.
  7. @Override
  8. public String toString() {
  9. return SUBJECT + " - " + GRADE;
  10. }
  11. }

现在我们可以修改Person类,引入一个与JSON中EXAM同名的域,类型为Exam。注意,下面的Person类与前一个<span style=”color: #ff0000;”>位于</span>不同的包。

  1. package com.javacreed.examples.gson.part3;
  2. public class Person {
  3. private String NAME;
  4. private String LOCATION;
  5. private Exam EXAM;
  6. @Override
  7. public String toString() {
  8. return NAME + " - " + LOCATION + " (" + EXAM + ")";
  9. }
  10. }

注意,所需的变化是最小的,因为Gson动态发现(使用反射)类和它的域。本文不包含反射,对于更多关于反射的信息,请参考:Reflection in Action.

最后,让我们尝试新的变化。

  1. package com.javacreed.examples.gson.part3;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.Reader;
  5. import com.google.gson.Gson;
  6. import com.google.gson.GsonBuilder;
  7. public class JsonToJava {
  8. public static void main(String[] args) throws IOException {
  9. try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server2.json"), "UTF-8")){
  10. Gson gson = new GsonBuilder().create();
  11. Person p = gson.fromJson(reader, Person.class);
  12. System.out.println(p);
  13. }
  14. }
  15. }

JsonToJava类没有做任何改变,因为Gson使用了模型(Person和Exam类)将Json映射成Java。

结论

即使JSON可能是一个新概念,但它十分简单与直接。此外,相比于需要增加标签进行消息/数据转换而不断膨胀的笨重的XML,它因为简单更加流行。 需要指出JSON是JavaScript的一个子集,JavaScript将它作为一个完美的方案来进行数据交换,例如网页。GSON API使它更便于使用,即使在这里没有讨论的部分,它也提供了强大的灵活性。

欲了解更多GSON的例子,请移步第2部分,我们会探索更复杂的例子,并讨论如何使用GSON解串器来完全控制反序列化过程。

来源:51CTO

Java Json API:Gson使用简单入门相关推荐

  1. 【java开发系列】—— spring简单入门示例

    回顾 1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控 ...

  2. Java 官方性能测试工具 JMH 简单入门

    什么是 JMH JMH 是 Java Microbenchmark Harness 的缩写.中文意思大致是 "JAVA 微基准测试套件".首先先明白什么是"基准测试&qu ...

  3. java json to csv_最简单的JS实现json转csv的方法

    工作久了,总会遇到各种各样的数据处理工作,比如同步数据,初始化一些数据,目前比较流行的交互数据格式就是JSON,可是服务器中得到的JSON数据如果提供给业务人员看的话可能会非常不方便,这时候,转成CS ...

  4. 【java开发系列】—— struts2简单入门示例

    2019独角兽企业重金招聘Python工程师标准>>> 上篇推荐:JDK安装 前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉 ...

  5. API Gateway——KONG简单入门

    一.简介 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Kong,是由Mashape公司开源的,基于Nginx的API gateway. 二.特点 ...

  6. Java语言之动画的简单入门学习

    什么是 SVG? Google 在 Android5.X 中增加了对 SVG 矢量图形的支持,可以用来创建高效率的动画, 所以我们先来了解一下 SVG 的定义: 可伸缩矢量图形(Scalable Ve ...

  7. java mvc 菜鸟_Spring MVC 简单入门

    1331601238 卢久贵 web.xml 配置: dispatcher org.springframework.web.servlet.DispatcherServlet 加载/WEB-INF/s ...

  8. Java 关于序列化、Json和Gson详解

    文章目录 前言 序列化 什么是序列化 Java序列化 Java序列化.反序列化的基本用法 Java序列化的注意事项 JSON 和 Gson JSON概述 JSON语法规则 Gson Gson概述 Gs ...

  9. JAVA Bean和XML之间的相互转换 - XStream简单入门

    JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...

最新文章

  1. 大厂程序员和北京户口教师女友买房分歧,要求分配产权怕离婚扯皮
  2. docke跨主机通信之gre隧道
  3. webpack、rollup、parcel 它们的优劣?_尾货批发与正价批发优劣势,你有二者兼顾吗?...
  4. 企业信息化投入中咨询服务_企业信息化咨询中的问题与对策研究
  5. 【机器学习基础】数学推导+纯Python实现机器学习算法13:Lasso回归
  6. 陈百强原来这么帅_朱一龙虽然很少玩手机,但居式打字法很有个性,手指飞舞超级帅!...
  7. 数据结构与算法专题——第九题 鸡尾酒排序
  8. mybatis-generator插件使用 批量插入、更新
  9. 做了5年领导,看到员工年终汇报这么做,也忍不住给他加薪
  10. crontab 简介
  11. android bootstrap功能,整合QMUI Android和Android-Bootstrap
  12. win7清理系统后,音频设备被禁用,没有声音
  13. 电脑ping_电脑网络故障检测与维护—常用DOS命令
  14. SCTF-2019 Misc wp
  15. 了解Linux操作系统
  16. android开发 app消息提醒功能,APP消息提醒设计:ios和android的最佳设计方案 – 25学堂...
  17. Python实现测量平差数据处理
  18. 手把手教你批量下载微博视频
  19. 信号与系统之(二)傅里叶级数和傅里叶变换
  20. 104 自定义大头针

热门文章

  1. 【C++】C++11 STL算法(八):对未初始化内存的操作(Operations on uninitialized memory)、C库(C library)
  2. #Ruby# Introspect (1)
  3. html 显示消息数量,html实现消息按钮上的数量角标的实例详解
  4. php读取access编码格式,php+access如何设置编码格式
  5. 爬虫python爬取页面请求_Python网络爬虫第三弹《爬取get请求的页面数据》
  6. java fork join原理_细说Fork/Join框架
  7. 计算机竞赛CCC可以直接学吗,CCC 计算机竞赛到底有多牛!
  8. 优化实战:不要随便将字段折腾来折腾去的
  9. datatable无法设置横向滚动条(设置无效)
  10. 活动目录在构建核心过程中的八个关键点(下)