原文链接:Gson Advanced — Mapping of Enums
原文出自:Norman Peitek
译者:無名無
回顾之前的一系列文章,我们已经了解了嵌套对象、数组、List、Map 的映射,本文将介绍使用 Gson 解析枚举类型。
Enum 序列化
枚举在 Java 中使用非常普遍,可以使用它来规范一些常量的取值。但对于 JSON 来说,同样是不存在枚举类型,如果在解析中使用了枚举,将会发生什么?
先来定义一个枚举 Day:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
在创建一个 Java model 类:
public class UserDayEnum {
private String _name;
private String email;
private boolean isDeveloper;
private int age;
private Day day = Day.FRIDAY;
}
我们使用 Gson 来序列化 UserDayEnum 对象:
UserDayEnum userObject = new UserDayEnum("Norman", "[email protected]", true, 26, Day.SUNDAY);
Gson gson = new Gson();
String userWithEnumJson = gson.toJson(userObject);
输出:
{
"_name": "Norman",
"age": 26,
"day": "SUNDAY",
"email": "[email protected]",
"isDeveloper": true
}
根据结果我们看到,不用做任何配置处理,Gson 就帮我们正常输出了 JSON 格式的数据。
Enum 反序列化
反序列化也非常简单,同样不做任何额外的配置:
String userJson = "{\"age\":26,\"email\":\"[email protected]\",\"isDeveloper\":true,\"day\":\"FRIDAY\"}";
Gson gson = new Gson();
UserDayEnum userObject = gson.fromJson(userJson, UserDayEnum.class);
输出:
userDayEnum:UserDayEnum{_name='null', email='[email protected]', isDeveloper=true, age=26, day=FRIDAY}
自定义枚举(反)序列化
使用 @SerializedName 注解给每个变量赋予另一个字段名:
public enum Day2 {
@SerializedName("0")
MONDAY(),
@SerializedName("1")
TUESDAY,
@SerializedName("2")
WEDNESDAY,
@SerializedName("3")
THURSDAY,
@SerializedName("4")
FRIDAY,
@SerializedName("5")
SATURDAY,
@SerializedName("6")
SUNDAY
}
我们将使用新的 JSON 数据来反序列化:
String userJson = "{\"age\":26,\"email\":\"[email protected]\",\"isDeveloper\":true,\"day\":0}";
Gson gson = new Gson();
UserDayEnum2 userDayEnum2 = gson.fromJson(userJson, UserDayEnum2.class);
输出:
userDayEnum2:UserDayEnum{_name='null', email='[email protected]', isDeveloper=true, age=26, day2=MONDAY}
通过结果可以看到枚举的反序列化使用,并配合 @SerializedName 来简化使用。
目标
了解和使用 Gson (反)序列化枚举数据类型。
练习代码已上传 Github https://github.com/whiskeyfei/Gson-Review 可自行查看。
Gson 系列文章翻译回顾
1、Gson - Java-JSON 序列化和反序列化入门
2、Gson - 映射嵌套对象
3、Gson - Arrays 和 Lists 映射对象
4、Gson - Map 结构映射
5、Gson - Set 集合映射
6、Gson - 空值映射
7、Gson Model Annotations - 如何使用 @SerializedName 更改字段的命名
8、Gson Model Annotations - @SerializedName 匹配多个反序列化名称
9、Gson Builder - 基础和命名规则
10、Gson Builder - 序列化空值
11、Gson Builder - 忽略策略
12、Gson Builder - Gson Lenient 属性
13、Gson Builder - 特殊类型 Floats & Doubles
17、Gson Builder - 如何使用 @Expose 忽略字段
19、Gson Advanced - 映射枚举类型
20、Gson Advanced - 映射循环引用
21、Gson Advanced - 泛型
22、Gson Advanced - 简单自定义序列化 (Part 1)
24、Gson Advanced - 自定义反序列化基础
25、Gson Advanced - 自定义对象实例创建
26、Gson Advanced - 通过 @JsonAdapter 自定义(反)序列化过程
32、Practical Gson - 如何解析多态对象
学习讨论
刚刚建了一个 Android 开源库分享学习群,有兴趣的小伙伴可以加入一起学习。