【问题标题】:Initializing enum in java using gson使用gson在java中初始化枚举
【发布时间】:2015-02-18 03:50:58
【问题描述】:

考虑下面的代码

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 的值一些整数。显然 MyEnum 没有被反序列化,所以我什至不知道 MyEnum 是否可以被 gson 序列化。

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

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

【问题讨论】:

    标签: java json enums gson


    【解决方案1】:

    MyClass 上没有任何 MyEnum 字段。你只有一个枚举类型的声明。所以序列化后得到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());
    

    输出:

    我的枚举:ENUM_A
    myEnum.desc:这是一个

    编辑:

    您定义了一个名为 MyEnum 的枚举,它有一个值,例如 ENUM_A("This is a"),并且您想以编程方式将此值的 desc 从“This is a”更改为“A for apple”,是对吗?如果是这样,枚举是不可能的,因为它们是在编译时初始化的,并且不能在运行时更改。您可以阅读Enum.valueOf 方法,了解 valueOf 方法后 desc 部分会更有意义。同样对于您的“另一个问题”,我猜您对静态类和静态字段有误解

    【讨论】:

    • 谢谢你,但这不是我想要的。我实际上只想初始化 MyEnum。即我想从一个json字符串中读取来设置MyEnum中的desc,这样在反序列化之后,MyEnum就变成了ENUM_A(“A for apple”,ENUM_B(“B for boy”)。接着又问了一个问题,我是否真的可以重新初始化一个枚举以及已经使用该枚举的其他代码会发生什么情况,它们是否会更新为使用新的枚举 desc(因为枚举是静态的)。
    • 您定义了一个名为 MyEnum 的枚举,它有一个值如 ENUM_A("This is a"),并且您想以编程方式将此值的 desc 从“This is a”更改为“A为苹果”,对吗?如果是这样,枚举是不可能的,因为它们是在编译时初始化的,并且不能在运行时更改。你可以阅读 Enum.valueOf 方法,了解 valueOf 方法后 desc 部分会更有意义。同样对于您的“另一个问题”,我猜您对静态类和静态字段有误解。
    • 再次感谢。所以是的,这就是我真正想要的:一个 json 可配置的枚举类。由于您当前的答案与我真正提出的问题无关,请您用新答案更新它(即不可能进行枚举配置),以便我可以检查您的答案作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多