使用 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
的默认序列化/反序列化,因此基本上应该使用标准的toJson
和fromJson
方法对其进行序列化和反序列化,与任何其他类型一样。
【讨论】:
默认情况下,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
字段,它代表的值不是0
、1
或2
。
我有一个安静的网络服务,在通信时处理枚举值 (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 序列化和反序列化枚举 [重复]的主要内容,如果未能解决你的问题,请参考以下文章