使用gson在java中初始化枚举

时间:2015-02-18 03:50:59

标签: 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; }
    }
    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(字符串,MyClass.class)创建 MyClass 实例时,如何初始化 MyEnum 枚举的desc示例),或通过MyEnum e = gson.fromJson(string,MyEnum.class)直接初始化 MyEnum

由于MyEnum是静态的,运行上面的代码后会发生什么?使用MyEnum的其他代码现在是否会选择新的desc?

1 个答案:

答案 0 :(得分:2)

MyEnum处的MyClass没有任何字段。您只有枚举类型的声明。因此,序列化后获取someStringsomeInteger值非常正常。

将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(“这是一个”)的值,并且你想要以编程方式将这个值的desc从“This is a”更改为“A for apple”,那是对的吗?如果是这样,枚举是不可能的,因为它们在编译时初始化,并且在运行时无法更改。你可以阅读Enum.valueOf方法,在理解了valueOf方法后,desc部分会更有意义。另外对于你的“另一个问题”,我猜你对静态类和静态字段有误解