完全理解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.comliken
译文链接: http://www.importnew.com/16630.html

from: http://www.importnew.com/16630.html

时间: 2024-11-05 13:38:16

完全理解Gson(1):简单入门的相关文章

Java Json API:Gson使用简单入门

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://

完全理解Gson(3):Gson反序列化

完全理解Gson(2):Gson序列化 完全理解Gson(1):简单入门 本文延续前一篇文章,继续介绍简单基本的Gson用法.这篇文章我们将介绍如何将复杂的JSON对象解析为Java对象,其中Java对象的结构可以与JSON对象不一致.我们还会看到如何使用Gson反序列化器(JsonDeserializer Java文档)将JSON对象映射为Java对象. 观察 请注意,文中解析(parse)与反序列化(deserialise)将互换使用. 下面列出的所有代码都可以在 https://java-

iBatis简单入门教程

iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了. 官网为:http://www.mybatis.org/ 搭建iBatis 开发环境: 1 .导入相关的jar 包,ibatis-2.3.0.677.jar .mysql-connector-java-5.1.6

Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

出处:http://www.cnblogs.com/SeeYouBug/p/6401737.html 一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数据的操作的一个封转.可以分为视图模型(view model)和领域模型(domain models),视图模型就是在视图与控制器之间传输数据的一个封转,而领域模型就是业务逻辑,后台数据模型等的一个集

响应式网页设计简单入门(强烈推薦!!!!)

响应式网页设计简单入门 Overview: 构造基本的HTML页面 动态加载样式表 Viewport 字体缩放 侧边栏 导航菜单 图片自适应 其他 总结 说到响应式网页设计(Responsive web design),最近在谷歌加上碰到个奇葩贴子,通过一个原始到无法再简单的网页Motherfucking Website及满屏幕的fuck道出了网页设计的真谛,这孩子不是个激进分子就是个报复社会型的货没错,虽然整篇文章就像是泼妇骂街,但我特么是笑着读完的.. 统计了下全文共用Fuck (包括fuc

delphi指针简单入门

delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   X   and   Y   整数类型     3             P:   ^Integer;           //   P   指向整数类型的指针     4         begin     5             X   :=17; //   给   X   赋值     6

Swift简单入门教程:30分钟玩转Swift

通常来说,编程语言教程中的第一个程序应该在屏幕上打印“Hello, world”.在 Swift 中,可以用一行代码实现:    println("hello, world") 如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式——在 Swift 中,这行代码就是一个完整的程序.你不需要为了输入输出或者字符串处理导入一个单独的库.全局作用域中的代码会被自动当做程序的入口点,所以你也不需要main函数.你同样不需要在每个语句结尾写上分号. 这个教程会通过一系列编程

SpringMVC:学习笔记(1)——理解MVC及快速入门

SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page Controller + Context 三种模式是JavaWeb设计模式的逐渐适配和演进.本文分别讲述了这三种模式,作为了解即可.SpringMVC正是采用了第三种设计模式. MVC 说明 MVC是Xerox PARC在20世纪80年代为编程语言SmallTalk发明的一种软件设计模式. MVC是一种设计模式

emacs最简单入门,只要10分钟

macs最简单入门,只要10分钟  windwiny @2013   无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完一遍,再动手操作.这次好像有些进展   最大的发现,emacs里所有操作都是LISP指令,包括上下左右移动光标,这意味着什么? “emacs是一个伪装成编辑器的操作系统”这句话应该就是这么理解吧,所有的操作都是指令,emacs就像操作系统一样,平时不用关注,实际上打交道的都是操作系统上运行的各种程序.

Java的多线程 简单入门

Java的多线程 简单入门 首先可以先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位: 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程: 进程与线程区别与联系 (