作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的目标是将一个 JSON 文件或其中的一部分解析为 Java 中的 Enum 类。我可以很容易地做到这一点,但出于调试原因,我还想包括一个默认值。
public enum MyEnum {
@SerializedName("texts")
TEXTS,
@SerializedName("buttons")
BUTTONS,
@SerializedName("inputs")
INPUTS,
DEFAULT
}
因此,如果我尝试解析此 JSON(使用包装器类):
{enum: "buttons"}
我会得到 MyEnum.BUTTONS
,但如果我尝试解析:
{enum: "divider"}
我还是想知道值(value)。我想将所有值(例如“divider”、“line”、“color”...)映射到 DEFAULT
(维护映射到 DEFAULT
的字符串值(value))。是否可以将值“divider”保存到 MyEnum.DEFAULT
属性?
最佳答案
实现自定义 JsonDeserializer并使用 GsonBuilder.registerTypeAdapter 安装它.然后,您的枚举实现可以按如下方式实现:
public enum MyEnum {
TEXTS ("texts"),
BUTTONS("buttons"),
INPUTS("inputs"),
DEFAULT(null);
private String text;
private MyEnum (String text) {
this.text = text;
}
public String getValue () {
return text;
}
public static MyEnum mapFrom (String serialized) {
if (serialized == null) {
DEFAULT.text = null;
return DEFAULT;
}
for (MyEnum inst : MyEnum.values()) {
if (serialized.equals(inst.getValue())) {
return inst;
}
}
DEFAULT.text = serialized;
return DEFAULT;
}
}
反序列化器(以及序列化器)的实现随后使用枚举的 mapFrom
方法。副作用是 DEFAULT
实例在全局范围内始终具有最新值,因此如果使用范围比调试更广,我不推荐这种方法,老实说我不希望有其他程序员了解我为什么写这篇文章。
但是,如果您从枚举定义中提取枚举的序列化形式,那么在反序列化器中您需要实现一个开关来决定反序列化到哪个枚举。如果您还分离调试代码并从反序列化器调用它,则您不再需要枚举中的序列化形式。此外,您将不同的功能分开 - Single Responsibility Principle .
剩下的唯一选择是使用非枚举类,因此您可以在反序列化时实例化新对象。
关于java - 使用 GSON 将 JSON 反序列化为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36716852/
我是一名优秀的程序员,十分优秀!