Gson 映射 Enum 枚举
在之前的文章中我们介绍了如何映射嵌套对象、数组和列表、Java Map 等。 在这篇文章中,您将学习如何(反)序列化 Java 枚举 Enum。
Java 枚举的序列化
Java 枚举可能是一种非常有用的数据类型。 它们将变量值限制为预定义的常量数量。 虽然这在内部非常实用,但没有 JSON 等价物。 JSON 不知道任何常量,那么如果模型包含枚举会发生什么?
首先,让我们为星期几创建一个示例 Java 枚举:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
这是一个标准枚举,我们可能会在很多 Java 应用程序中找到它。 假设我们的应用程序使用 UserDayEnum 模型类,其中包含枚举属性 day:
public class UserDayEnum {
private String _name;
private String email;
private boolean isDeveloper;
private int age;
private Day day = Day.FRIDAY;
}
天到周五的默认初始化没有更深的含义。
但是如果我们试图序列化其中一个对象会发生什么? 以前使用过 Gson 的开发人员,已经有一种直觉:是的,Gson 会自动完成所有事情 :)
没有任何额外的配置,我们可以简单地调用 toJson()
并且 Gson 将使用枚举的值作为 JSON 值:
UserDayEnum userObject = new UserDayEnum("jiyik", "jiyik_onmpw@163.com", true, 26, Day.SUNDAY);
Gson gson = new Gson();
String userWithEnumJson = gson.toJson(userObject);
上面代码将生成如下的 json
{
"_name": "jiyik",
"age": 26,
"day": "SUNDAY",
"email": "jiyik_onmpw@163.com",
"isDeveloper": true
}
Java 枚举的反序列化
反序列化的工作方式非常相似。 我们无需进行任何额外的配置,只需使用已知方法调用 fromJson()
即可。 例如,Gson 将从以下 JSON 创建正确匹配的 Java 对象:
{
"email": "jiyik_onmpw@163.com",
"age": 26,
"day": "FRIDAY"
}
正如现在可能看到的那样,内部枚举具有分配给每个枚举值的序号。 对于我们的 Day 枚举,MONDAY 为 0,TUESDAY 为 1,依此类推。 Gson 还接受这些序数作为反序列化输入,并将其与正确的枚举值匹配。
{
"email": "jiyik_onmpw@163.com",
"age": 26,
"day": 4
}
对于上述 JSON 的情况,Gson 还将日期值设置为 FRIDAY。
如果我们想将 Friday 序列化为 4,则下一部分会有大家想要的方法。
自定义枚举(反)序列化
最后,枚举值可能并不总是有一个好的或合适的名称。 当然,我们可以使用我们之前看到的相同注解来更改(反)序列化。 例如,@SerializedName
让我们可以选择更改一个或多个枚举值的名称:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
@SerializedName("LazyDay1") SATURDAY,
@SerializedName("LazyDay2") SUNDAY
}
相关文章
Gson 通过@JsonAdapter 自定义(反)序列化
发布时间:2022/07/24 浏览次数:217 分类:编程语言
-
在这篇文章中,我们将展示如何简化(反)序列化的自定义。 所有这些选项都只能通过自定义 Gson 实例和一些样板代码获得。 Gson 2.7 引入了一个简单的注解,我们可以节省大量代码并获
Gson 自定义反序列化基础
发布时间:2022/07/21 浏览次数:81 分类:编程语言
-
在这篇文章中,我们将了解如何实现自定义 Gson 反序列化。 如果服务器以与客户端的应用程序数据模型不匹配的格式向我们发送数据,请继续阅读!
Gson 自定义实例创建器
发布时间:2022/07/14 浏览次数:121 分类:编程语言
-
在这篇文章中,我们将讨论自定义反序列化的另一个组件。 在过去的几篇文章中,我们探讨了如何自定义数据的序列化和反序列化。 在这两种情况下,我们都试图减轻服务器和客户端之
Gson 循环引用的映射
发布时间:2022/07/13 浏览次数:173 分类:编程语言
-
在这篇文章中,我们将讨论一个特别讨厌的话题:循环引用。 我们可能在计算机科学或图表数学课上听说过循环引用。 在更实际的解释中:它处理对象具有指向不同对象的嵌套属性的情
Gson Builder Floats 和 Doubles 的特殊值
发布时间:2022/07/12 浏览次数:193 分类:编程语言
-
在上一篇 Gson 的文章中,我们研究了使 JSON 转换降低标准的选项。 Lenient 允许传入的 JSON 在某种程度上是非标准的,Gson 仍然能够将其解析为 Java 对象。 在这篇文章中,我们将研究一个
Gson 自定义序列化
发布时间:2022/07/11 浏览次数:117 分类:编程语言
-
在这篇文章中,我们将探讨如何自定义 Java 对象的 Gson 序列化。 我们可能想要更改序列化的原因有很多,例如 简化我们的模型以减少发送的数据量或删除个人信息。 现在我们将通过实
Gson 如何反序列化多态对象列表
发布时间:2022/07/09 浏览次数:286 分类:编程语言
-
最近,我们遇到了一种情况,我从 REST 端点接收到 JSON 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以
Gson Builder 使用 Lenient 放宽 Gson 的转换标准
发布时间:2022/06/26 浏览次数:100 分类:编程语言
-
JSON 内容的格式必须满足一些特定的规则才能符合标准。 该标准在 RFC4627 规范中进行了描述。 它为键和值的分离方式、数组的结构等奠定了基础。 在这篇文章中,我们将探讨 Gson 与 J