考虑以下代码
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?
答案 0 :(得分:2)
MyEnum
处的MyClass
没有任何字段。您只有枚举类型的声明。因此,序列化后获取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(“这是一个”)的值,并且你想要以编程方式将这个值的desc从“This is a”更改为“A for apple”,那是对的吗?如果是这样,枚举是不可能的,因为它们在编译时初始化,并且在运行时无法更改。你可以阅读Enum.valueOf
方法,在理解了valueOf方法后,desc部分会更有意义。另外对于你的“另一个问题”,我猜你对静态类和静态字段有误解