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"
,
"[email protected]"
,
true
,
26
, Day.SUNDAY);
Gson
gson
=
new
Gson
();
String
userWithEnumJson
=
gson.toJson(userObject);
上面代码将生成如下的 json
"_name"
:
"jiyik"
,
"age"
:
26
,
"day"
:
"SUNDAY"
,
"email"
:
"[email protected]"
,
"isDeveloper"
:
true
Java 枚举的反序列化
反序列化的工作方式非常相似。 我们无需进行任何额外的配置,只需使用已知方法调用
fromJson()
即可。 例如,Gson 将从以下 JSON 创建正确匹配的 Java 对象:
"email"
:
"[email protected]"
,
"age"
:
26
,
"day"
:
"FRIDAY"
正如现在可能看到的那样,内部枚举具有分配给每个枚举值的序号。 对于我们的 Day 枚举,MONDAY 为 0,TUESDAY 为 1,依此类推。 Gson 还接受这些序数作为反序列化输入,并将其与正确的枚举值匹配。
"email"
:
"[email protected]"
,
"age"
:
26
,
"day"
:
4
对于上述 JSON 的情况,Gson 还将日期值设置为 FRIDAY。
如果我们想将 Friday 序列化为 4,则下一部分会有大家想要的方法。
自定义枚举(反)序列化
最后,枚举值可能并不总是有一个好的或合适的名称。 当然,我们可以使用我们之前看到的相同注解来更改(反)序列化。 例如,
@SerializedName
让我们可以选择更改一个或多个枚举值的名称:
public
enum
Day
{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
@SerializedName("LazyDay1")
SATURDAY,
@SerializedName("LazyDay2")
SUNDAY
Java Struts2 框架 java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY 错误解决
PHP扩展开发 ini配置项定义
php zookeeper你需要知道的细节
PHP操作redis的两种方式
PHP简体转繁体——MediaWiki-zhconvert
PHP7 中 include、require 相对于PHP5你所不知道的一些
Python 错误 IsADirectoryError: [Errno 21] Is a directory 解决方法
PHP——json_encode中文编码问题
PHP重写session机制