[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对象。为了使这个例子更有趣,假设我们只对name和location字段感兴趣。
首先,我们需要创建一个具有我们想要表示的字段(name和location)的Java类。让我们称其为 Person
类。这个类的名称无关紧要,但字段的名称却不是。字段名称必须与JSON中的名称相匹配(包括大小写)。此外,这个类必须包含一个默认构造函数(即使是设置为 private
)。如下所示,字段name和location就和在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 谢谢!