在之前的文章中我们介绍了如何映射嵌套对象、数组和列表、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
}
免责声明:
1.本站所有内容由本站原创、网络转载、消息撰写、网友投稿等几部分组成。
2.本站原创文字内容若未经特别声明,则遵循协议CC3.0共享协议,转载请务必注明原文链接。
3.本站部分来源于网络转载的文章信息是出于传递更多信息之目的,不意味着赞同其观点。
4.本站所有源码与软件均为原作者提供,仅供学习和研究使用。
5.如您对本网站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。
火焰兔 » Gson 映射 Enum 枚举