Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GSON对JSON进行反序列化以枚举_Java_Enums_Gson - Fatal编程技术网

Java 使用GSON对JSON进行反序列化以枚举

Java 使用GSON对JSON进行反序列化以枚举,java,enums,gson,Java,Enums,Gson,我的目标是将JSON文件或其一部分解析为Java中的Enum类。我可以很容易地做到这一点,但出于调试的原因,我也想包括一个默认值 public enum MyEnum { @SerializedName("texts") TEXTS, @SerializedName("buttons") BUTTONS, @SerializedName("inputs") INPUTS, DEFAULT } 因此,如果我尝试解析这个JSON(使用包装器类

我的目标是将JSON文件或其一部分解析为Java中的Enum类。我可以很容易地做到这一点,但出于调试的原因,我也想包括一个默认值

public enum MyEnum {
    @SerializedName("texts")
    TEXTS,
    @SerializedName("buttons")
    BUTTONS,
    @SerializedName("inputs")
    INPUTS,
    DEFAULT
}
因此,如果我尝试解析这个JSON(使用包装器类):

我会得到
MyEnum.BUTTONS
,但如果我尝试解析:

{enum: "divider"}
我仍然想知道它的价值。我想将所有值(例如“分隔符”、“线条”、“颜色”等)映射到
默认值
(维护映射到
默认值的字符串)。是否可以将值“divider”保存到MyEnum.DEFAULT属性中?

实现自定义并使用安装。然后可以按如下方式实现您的枚举实现:

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
实例在全局范围内始终具有最新的值,因此如果使用范围比调试更广,我不建议使用这种方法,老实说,我不希望其他程序员理解我为什么编写这种方法

但是,如果从枚举定义中提取枚举的序列化形式,则在反序列化程序中,需要实现一个开关,该开关决定反序列化到哪个枚举。如果您还分离调试代码并从反序列化程序调用它,那么您就不再需要枚举中的序列化形式。此外,您还可以将不同的功能分离开来


剩下的唯一其他选项是使用非枚举类,这样您就可以在反序列化时实例化新对象。

不清楚您想要实现什么。
MyEnum.DEFAULT
是否只有一个序列化值“divider”?或者您想将每个无法识别的字符串映射到默认值吗?自定义(反)序列化程序可能是一个选项,请参阅手册检查我的最新编辑
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;
    }
}