Gson Advanced — 映射枚举类型

作者: 無名小子的杂货铺 | 来源:发表于2016-12-05 16:36 被阅读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 - 如何解析多态对象

    相关文章

      网友评论

        本文标题:Gson Advanced — 映射枚举类型

        本文链接:https://www.haomeiwen.com/subject/nprcmttx.html