微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gson用户指南,教育移动互联网应用程序app

使用Gson

一个简单示例

GSON API提供一个文件,Gson(Java文档),它被用来处理Java和JSON对象的转换。可以调用认构造器,或如下代码的形式,使用GsonBuilder(Java文档)类创建这个类的实例。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

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

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(教程)中。我们忽略了这个是为了保持代码简洁。

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类时,如果不提供编码或者字符集,转换将使用平台认字符集。这将降低代码的可移植性,且在其他平台上运行将可能产生错误行为。

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对象:

{

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部分中讨论。

p

ackage 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文件夹的文件里(这不是常规做法)。

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§;

}

}

}

lic 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§;

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐