原文链接:Getting Started with Java-JSON Serialization & Deserialization
翻译:签到钱就到
在发布了50多篇Retrofit的文章之后,收到很多读者的反馈,要求我们对Google的Gson做一个扩展介绍。Gson是一个将JSON格式的数据结构映射成java对象的非常强大的库。当然,它也支持其他组织的方式,并且也能为你的java对象创建合适的JSON表示形式。
如果你对我们正在进行的这个系列感兴趣,请浏览一下下面的大纲。
Gson系列概览
- Gson——用java-JSON实现序列化和反序列化
- Mapping of Nested Objects
- Mapping of Arrays and Lists of Objects
- Mapping of Maps
- Mapping of Sets
- Mapping of Null Values
- Gson Model Annotations — How to Ignore Fields with @Expose
- Gson Model Annotations — How to Change the Naming of Fields with @SerializedName
- Gson Builder — Basics & Naming Policies
- Gson Builder — Force Serialization of null Values
- Gson Builder — Exclusion Strategies
- Gson Builder — Relax Gson with Lenient
- Gson Builder — Special Values of Floats & Doubles
- Gson Builder — Model Versioning
- Gson Builder — Formatting of Dates & Custom Date/Time Mapping
- Gson Builder — Pretty Printing
- Gson Builder — HTML Escaping
Gson 依赖
本指南将要着手,首先在一分钟内完成一些序列化的准备工作。
由于大多数读者都是Android开发者,我们会为你量身定制,但是Gson也能被用在任何Java环境中。在我们开始之前,我们需要将Gson库拖到我们的项目工程中。截止到写作时间,最新的版本是2.6.2
。如果你正在使用Gradle,添加下面的代码:
compile 'com.google.code.gson:gson:2.6.2'
如果你正在使用Maven,你可以添加下面的依赖:
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
对于那些都没有使用依赖环境系统的可怜家伙,你可以从官方的Github仓库里下载jar包。
Java-JSON序列化基础
让我们做一些系列化!在Gson中序列化是指映射一个java对象到它的JSON表达。在后续的教程中,我们的数据将会变得更复杂,但是我们现在只要从一些非常简单的UserSimple
开始:
public class UserSimple {
String name;
String email;
int age;
boolean isDeveloper;
}
user对象有四个属性:
- user的
name
是一个 String 对象 - user的
email
是一个 String 对象 - user的
age
是一个 integer, 表明是按年来表示的(例如26
,并非准确的生日!) - 一个 boolean 标签
isDeveloper
我们的Android或java应用需要转换一个UserSimple对象到它的JSON表示。假设我们保持成员变量名字一致,我们会为Norman(这篇文章的作者)准备这样的JSON表示:
{
"name": "Norman",
"email": "norman@futurestud.io",
"age": 26,
"isDeveloper": true
}
让我们研究怎么用Gson完成转换。首先,我们需要为Norman创建一个Java对象。
UserSimple userObject = new UserSimple(
"Norman",
"norman@futurestud.io",
26,
true
);
译者注:如果没有在UserSimple类里添加对应的构造函数,上面会报错。添加也很简单,UserSimple类内部编辑界面,右键—>Generate->Constructor->全部选中 ,点击ok。自动生成如下代码:
public UserSimple(String name, String email, int age, boolean isDeveloper) {
this.name = name;
this.email = email;
this.age = age;
this.isDeveloper = isDeveloper;
}
为了完成序列化,我们需要一个Gson
对象来操作转换。我们可以简单的使用下面的创建:
Gson gson = new Gson();
为了开始序列化,我们需要调用toJson()
方法,然后传递UserSimple
对象:
String userJson = gson.toJson(userObject);
userJson
对象包含了下面的值:
{
"age": 26,
"email": "norman@futurestud.io",
"isDeveloper": true,
"name": "Norman"
}
Gson改变了属性的顺序(按字母顺序),但是内容是一样的!注意Gson是如何表示这些类型的。String值用“”
包裹,但integer值却没有包裹。我们不需要在JSON对象或复制单个成员上浪费时间。一个Gson的简单调用足以映射整个对象。当我们处理非常复杂的数据结构时,这是非常方便的。但在我们进一步深入之前,我们测试另一个方向。Gson可以从上面的JSON数据中创建一个java对象么?
java-JSON 反序列化基础
首先,我们需要创建一个字符串,包含上面提到的JSON:
String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";
我们将 "
变为 '
,是为了避免大量的\"
转义。它就是这样工作的。下一步,可能你已经猜到了,创建一个Gson实例:
Gson gson = new Gson();
最后,我们必须用fromJson()
映射一个JSON到一个Java对象:
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
注意我们是怎样将Java对象作为第二个参数进行传递。否则Gson不知道应该将JSON映射。它不是一个魔术师!
如果我们添加了一个debugger并且检查了user对象的结果,它会展示Gson成功地准确映射了所有属性:
计划 与 展望
看完这篇引导文章后,你应该已经了解了Gson的基本使用。我们已经展示了如何简单地完成JSON数据与Java的映射。我们也知道你此刻肯定有大量的问题要问:
- Java模型类需要一个constructor/getter/setter么?
- Java模型字段可以是私有(private)的么?
- 怎样处理空值(null values)?
- 对于JSON数据,如果Java类有不同的变量命名怎么办?
- 如何序列化(反序列化)对象数组/列表?
- 如何序列化(反序列化)嵌套对象?
- 当执行
.fromJson()
时,JSON数据中获取不到某个属性的值,Gson会为其保留一个默认的值么?
没必要担心,我们会在后续的文章中一一解答。如果你有特别的主题,在下面的评论中或twitter@futurestud_io让我们知道。