Android代码封装Android知识Android开发

Gson Advanced — 映射枚举类型

2016-12-05  本文已影响1061人  無名小子的杂货铺

原文链接: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", "norman@fs.io", true, 26, Day.SUNDAY);

Gson gson = new Gson();  
String userWithEnumJson = gson.toJson(userObject);  

输出:

{
      "_name": "Norman",
      "age": 26,
      "day": "SUNDAY",
      "email": "norman@fs.io",
      "isDeveloper": true
}

根据结果我们看到,不用做任何配置处理,Gson 就帮我们正常输出了 JSON 格式的数据。

Enum 反序列化

反序列化也非常简单,同样不做任何额外的配置:

    String userJson = "{\"age\":26,\"email\":\"norman@futurestud.io\",\"isDeveloper\":true,\"day\":\"FRIDAY\"}";
    Gson gson = new Gson();
    UserDayEnum userObject = gson.fromJson(userJson, UserDayEnum.class);

输出:

userDayEnum:UserDayEnum{_name='null', email='norman@futurestud.io', 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\":\"norman@futurestud.io\",\"isDeveloper\":true,\"day\":0}";
    Gson gson = new Gson();
    UserDayEnum2 userDayEnum2 = gson.fromJson(userJson, UserDayEnum2.class);

输出:

    userDayEnum2:UserDayEnum{_name='null', email='norman@futurestud.io', 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 - 如何解析多态对象

上一篇下一篇

猜你喜欢

热点阅读