简单GSON用法示例

[todo]转载请注明出处


GSON是由Google开发的Java API,用于在Java对象和JSON对象之间进行转换。本文讨论并提供使用此API的简单代码示例。有关此API的详情,请访问:http://sites.google.com/site/gson/

这是GSON系列文章的第一篇,作为其他文章的入门篇,并不要求读者有GSON或JSON的经验。第二篇文章[todo]提供了更多使用GSON反序列化器(deserializer)的例子(JSON转Java),第三篇文章[todo]提供了更多关于GSON序列化器的例子(Java转JSON)。

本文的所有代码均可在以下网址找到:https://java-creed-examples.googlecode.com/svn/gson/Simple%20Gson%20Example。大多数示例将不包含完整代码,并且可能省略与所讨论示例不相关的片段。读者可以从上面的链接下载或查看所有代码。

读者需要有基本的Java知识(教程)和非常基本的Maven(主页)知识。这里列出的代码使用maven下载GSON库。将项目在Springsource工具套件推荐的IDE中检出将无需配置任何东西。

下载并安装

您必须先下载相应的库(jar文件)并将其包含在类路径中才能开始使用该API。该库及其源代码和JavaDoc可以从以下网址下载:http://code.google.com/p/google-gson/downloads/list。下载后,将gson-<version>.jar添加到类路径。对于那些喜欢使用Maven来管理依赖项(JAR文件)的读者,请将以下依赖项添加到pom.xml中。

<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 文件夹下。或者,可以将库添加到应用服务器并使其可用于web应用。

一个简单的例子

GSON API提供了一个 Gson Java Doc)类,用于处理Java和JSON对象之间的转换。可以通过调用默认构造函数,或者像下面的示例一样,使用 GsonBuilder (Java Doc)创建此类的实例。 GsonBuilder 类提供定制,并允许开发人员根据需要实例化 Gson 

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对象。上面的代码将在命令行中输出:

"Hello"123

这并没有一飞冲天,但确是一个开始[译者注:原文“It’s not rocket science, but it’s a start.]。注意,上面的输出都是输出到命令行的。 toJason()方法有两个参数,即要转换为JSON的Java对象和 Appendable Java Doc)的实例。我们可以很容易的将输出更改为文件或网络流。

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();
    }
}
观察

为什么当实际类型是 FileWriter时,变量声明为 Writer 
让你的变量尽可能通用是一个好的做法在上面的例子中,我们只使用由 Appendable和 Writer接口定义的方法[译者注:因此,使用 Writer声明变量即可]。让变量类型比所需的更具体,将使代码更不便于移植,更难以维护,我们将会在下面的示例中看到。

注意,在上面的例子中,我们没有正确处理流(Writer)。理想情况下,资源在 finally块(教程)中关闭或如下所示在try-with-resources(教程)中使用。我们忽略了这一点,以使代码尽可能简单。

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() 方法需要一个 Appendable 实例,但字节流不是 Appendable 接口的子类。 Appendable 接口使用字符而不是字节。 Java提供了将字节流转换为字符流的 InputStreamReader (Java Doc OutputStreamWriter (Java Doc类,如接下来的例子所示。

观察

注意,当使用 InputStreamReader  OutputStreamWriter 类时,请确保提供编码或字符集,否则将使用平台默认值。这将使您的代码可移植性变差,并可能在另一个平台执行时产生错误的行为

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);
        }
    }
}

如您所见,我们只需要更改实例化部分,其余(除了import)代码不变。这便是使用接口而不是类作为变量类型的好处之一。

使用JSON对象

假设我们需要使用JSON对象并将它们加载为Java对象,并假设服务器在查询时将产生以下JSON:

{
  NAME:"Albert Attard",
  P_LANGUAGE:"Java",
  LOCATION:"Malta"
}

这个JSON对象包含三个字段及其各自的值。假设现在我们需要使用JSON对象并创建一个表示这些数据的Java对象。为了使这个例子更有趣,假设我们只对namelocation字段感兴趣。

首先,我们需要创建一个具有我们想要表示的字段(namelocation)的Java类。让我们称其为 Person类。这个类的名称无关紧要,但字段的名称却不是。字段名称必须与JSON中的名称相匹配(包括大小写)。此外,这个类必须包含一个默认构造函数(即使是设置为 private)。如下所示,字段namelocation就和在JSON中一样,保持大写。 JSON字段 P_LANGUAGE 将被忽略,因为Java对象不包含具有此名称的字段。字段的名称不遵循Java命名约定,但我们为了暂时保持简单,这是可以理解的。关于这一点将在第2篇[todo]讨论。

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内容保存在位于资源文件夹的文件中(通常不会是这样)。

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);
        }
    }
}

这将输出:

Albert Attard - Malta

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

嵌套的JSON对象

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

{
  NAME:"Albert Attard",
  P_LANGUAGE:"Java",
  LOCATION:"Malta",
  EXAM: {
    SUBJECT:"Programming",
    GRADE:4.5
  }
}

这里我们有一个 EXAM 字段,由两个其他字段 SUBJECT 和GRADE组成。同样的,我们需要修改上面定义的 Person 类以包含 EXAM 字段,并创建一个新的Java类来表示这个包含 SUBJECT 和GRADE字段的字段。

我们首先创建表示嵌套对象的新类。正如我们之前讨论的,类名是无关紧要的,但是字段的名称必须与JSON中定义的名称匹配。

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 类,并添加一个类型为 Exam 的与JSON中名称相同的新字段,如下所示。请注意,以下 Person 类与上一个位于不同的包中。

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

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

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标签来交换消息/数据的体积更大的、更繁琐的XML。值得指出的是,JSON是JavaScript的一个子集,这使其成为与基于JavaScript的应用程序(如网页)交换数据的理想选择。 GSON API使得它非常容易使用,同时提供了很大的灵活性——即使在这还没有讨论过。

有关更多GSON的示例,请访问第二篇[todo],我们将在其中探讨更复杂的示例,并讨论如何使用GSON反序列化器来完全控制反序列化的过程。



原文链接:SIMPLE GSON EXAMPLE

请大家尊重作者翻译成果,转载请标明出处:http://blog.csdn.net/call_me_lzm/article/details/53728691 谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值