使用 Gson 序列化和反序列化枚举 [重复]

Posted

技术标签:

【中文标题】使用 Gson 序列化和反序列化枚举 [重复]【英文标题】:serialize and deserialize enum with Gson [duplicate] 【发布时间】:2013-05-20 08:33:26 【问题描述】:

如何使用 gson 2.2.4 序列化和反序列化这样的简单枚举?

public enum Color 

    RED, BLUE, YELLOW;

【问题讨论】:

【参考方案1】:

根据Gson API documentation,Gson 提供了Enum 的默认序列化/反序列化,因此基本上应该使用标准的toJsonfromJson 方法对其进行序列化和反序列化,与任何其他类型一样。

【讨论】:

默认情况下,Gson 使用枚举的名称而不是序数值进行序列化和反序列化。有没有办法设置一个序列化器和反序列化器来按它们的序数值处理所有枚举? 可以为枚举添加注解@SerializedName @ViliusK 将使我的枚举序列化为 String.valueOf(ordinal),是否有类似的注释或方法可以使我的序列化枚举成为 int?例如“颜色”:1 是我想要的,而不是“颜色”:“1”。 (注意 1 左右的双引号) 链接已失效。 @SerializedName 产生一个字符串而不是一个整数。【参考方案2】:

你可以试试这个。

import com.google.gson.annotations.SerializedName;

public enum Color 

    @SerializedName("0")
    RED (0), 

    @SerializedName("1")
    BLUE (1),

    @SerializedName("2")
    YELLOW (2);

    private final int value;
    public int getValue() 
        return value;
    

    private Color(int value) 
        this.value = value;
    


【讨论】:

注意:这不适用于旧版本的 GSON。它适用于 2.1 及更高版本。 他要的是 2.2.4 版本,所以是的 这是一个非常棒的方法。我经常使用它,我认为在较新版本的 GSON 中,用户应该倾向于使用这种方法,因为它简洁且不需要复杂的自定义序列化/反序列化代码。 如何将未知的枚举值淡化为Unknown?例如,上面的枚举Color 应该有一个Unknown 字段,它代表的值不是012 我有一个安静的网络服务,在通信时处理枚举值 (1, 2) 而不是名称,因此该服务无法解析请求中的字符串值(“COLOR”)。从服务中获取的响应对象反序列化,数值就OK了。所以这种方法很有帮助。【参考方案3】:

这也很好用,但不知道来自哪个版本的 GSON:

public enum OrderLineTimeRegistrationStatus 
    None(0), Started(1), Paused(2);

    private int value;

    private OrderLineTimeRegistrationStatus(int value)
    
        this.value=value;
    

    public int getValue()
    
        return(value);
    

【讨论】:

恐怕不行。使用 Gson 2.8.0。它怎么能工作呢? Gson 很聪明,但没那么聪明。

以上是关于使用 Gson 序列化和反序列化枚举 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Gson将类序列化和反序列化

如何实现 Gson 序列化/反序列化过程中 过滤指定字段

枚举的反序列化不起作用 - Jackson [重复]

让我们畅通无阻:在 Scala 中使用 GSON 读取 Json

Jackson序列化(8)— 支持泛型的反序列化

Android开发中混淆后Gson序列化反序列化的那些坑