Java Json API:Gson使用简单入门

简介:

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

完全理解Gson(1):简单入门

本文是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.  
  3. import com.google.gson.Gson; 
  4. import com.google.gson.GsonBuilder; 
  5.  
  6. public class SimpleExample1 { 
  7.     public static void main(String[] args) { 
  8.         Gson gson = new GsonBuilder().create(); 
  9.         gson.toJson("Hello", System.out); 
  10.         gson.toJson(123, System.out); 
  11.     } 

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

"Hello"123

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

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

注意

为什么变量声明为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.     } 

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

注意

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

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

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

使用JSON对象

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

 
 
  1.   NAME:"Albert Attard"
  2.   P_LANGUAGE:"Java"
  3.   LOCATION:"Malta" 

此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.  
  3. public class Person { 
  4.     private String NAME; 
  5.     private String LOCATION; 
  6.  
  7.     // Getters and setters are not required for this example. 
  8.     // GSON sets the fields directly using reflection. 
  9.  
  10.     @Override 
  11.     public String toString() { 
  12.         return NAME + " - " + LOCATION; 
  13.     } 

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

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

输出如下:

Albert Attard - Malta

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

嵌套JSON对象

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

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

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

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

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

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

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

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

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

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

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

结论

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

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


来源:51CTO

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
1天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
3天前
|
存储 安全 Java
说说Java 8 引入的Stream API
说说Java 8 引入的Stream API
8 0
|
4天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
5天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
7天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
37 1
|
11天前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
23 0
|
16天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
17天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
20天前
|
关系型数据库 Java 开发工具
Java入门高频考查基础知识9(15问万字参考答案)
本文探讨了Spring Cloud的工作原理,包括注册中心的心跳机制、服务发现机制,以及Eureka默认的负载均衡策略。同时,概述了Spring Boot中常用的注解及其实现方式,并深入讨论了Spring事务的注解、回滚条件、传播性和隔离级别。文章还介绍了MySQL的存储引擎及其区别,特别关注了InnoDB如何实现MySQL的事务处理。此外,本文还详细探讨了MySQL索引,包括B+树的原理和设计索引的方法。最后,比较了Git和SVN的区别,并介绍了Git命令的底层原理及流程。
29 0
Java入门高频考查基础知识9(15问万字参考答案)
|
20天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
46 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)