使用gson在java中初始化enum

使用gson在java中初始化enum,java,json,enums,gson,Java,Json,Enums,Gson,考虑以下代码 public class MyClass { public static enum MyEnum { ENUM_A("This is a"), ENUM_B("This is b"); private String desc; private MyEnum(String desc) { this.desc = desc; } public String getDesc() { return desc; }

考虑以下代码

public class MyClass {
    public static enum MyEnum {
        ENUM_A("This is a"), ENUM_B("This is b");
        private String desc;
        private MyEnum(String desc) { this.desc = desc; }
        public String getDesc() { return desc; }
    }
    private String someString;
    private Integer someInteger;
    public MyClass(String string, Integer integer) {
        this.someString = string;
        this.someInteger = integer;
    }
}
我想使用一个json文件来初始化MyEnum枚举的desc。我首先打印了一个MyClass实例的json字符串,但是该字符串没有关于MyEnum的内容,只有someString和someInteger的值。显然,MyEnum没有被反序列化,所以我甚至不知道gson是否可以序列化MyEnum

您能否举例说明如何在通过MyClass c=gson.fromJson(string,MyClass.class)创建MyClass实例时初始化MyEnum的枚举的desc,或者通过MyEnum e=gson.fromJson(string,MyEnum.class)直接初始化MyEnum


由于MyEnum是静态的,运行上述代码后会发生什么?使用MyEnum的其他代码现在是否拾取了新的描述?

您在
MyClass
中没有MyEnum的任何字段。您只有一个枚举类型的声明。因此,在序列化之后获取
someString
someInteger
值是非常正常的

将MyEnum的字段添加到MyClass:

public class MyClass {
    public static enum MyEnum {
        ENUM_A("This is a"), ENUM_B("This is b");
        private String desc;
        private MyEnum(String desc) { this.desc = desc; }
        public String getDesc() { return desc; }
    }
    private String someString;
    private Integer someInteger;
    private MyEnum myEnum; // Add a field for MyEnum

    public MyClass(String string, Integer integer) {
        this.someString = string;
        this.someInteger = integer;

        this.myEnum = MyEnum.ENUM_A; // initialized myEnum with ENUM_A for demo.
    }
}
现在请尝试以下代码:

    Gson gson = new Gson();

    MyClass instance1 = new MyClass("str", 1);        
    System.out.println(gson.toJson(instance1));
输出:

{“myEnum”:“ENUM_A”,“someInteger”:1,“someString”:“str”}

如您所见,序列化已成功完成。现在尝试反序列化:

    Gson gson = new Gson();

    String json = "{\"myEnum\":\"ENUM_A\",\"someInteger\":1,\"someString\":\"str\"}";
    MyClass instance2 = gson.fromJson(json, MyClass.class);

    System.out.println("myEnum: " + instance2.myEnum);
    System.out.println("myEnum.desc: " + instance2.myEnum.getDesc());
输出:

myEnum:ENUM_A
myEnum.desc:这是一个

编辑:


您定义了一个名为MyEnum的枚举,它有一个值,如enum_a(“This is a”),您希望通过编程将该值的desc从“This is a”更改为“a for apple”,对吗?如果是这样,枚举是不可能的,因为它们是在编译时初始化的,不能在运行时更改。您可以阅读有关
Enum.valueOf
method的内容,了解了valueOf method之后,说明部分将更有意义。另外,关于你的“另一个问题”,我想你对静态类和静态字段有误解

谢谢,但这不是我想要的。实际上我只想初始化MyEnum。i、 e.我想从json字符串中读取以在MyEnum中设置desc,这样在反序列化之后,MyEnum变成ENUM_a(“苹果的a”),ENUM_B(“男孩的B”)。接下来是另一个问题,我是否可以实际重新初始化ENUM,以及已经使用ENUM的其他代码会发生什么情况,它们是否会更新为使用新的ENUM desc(因为枚举是静态的)。您定义了一个名为MyEnum的枚举,它有一个值,例如enum_a(“这是a”),并且您希望通过编程将该值的desc从“This is a”更改为“a for apple”,对吗?如果是这样,枚举是不可能的,因为它们在编译时初始化,在运行时不能更改。您可以阅读有关Enum.valueOf方法的内容,在理解valueOf方法后,描述部分将更有意义。另外,对于您的“另一个问题”,我猜您对静态类和静态字段有误解。T再次感谢hanks。是的,这就是我真正想要的:一个json可配置的枚举类。由于您当前的答案与我真正要求的答案不相关,请您用新的答案更新它(即无法进行枚举配置),以便我可以检查您的答案。