使用json.org JSON,您可以使用字符串来帮助重新创建枚举吗?

时间:2013-02-18 06:36:57

标签: java json string enums

我正在尝试从JSON字符串重新创建一个包含枚举常量(JSON字符串的源)的集合。我很难弄清楚如何从字符串中重新创建枚举。这些枚举包含了我需要访问的各种方法。

我看到thisthis one的答案会产生一个类,它使您能够遍历常量而不是重新创建原始枚举。我想在其他现有类中传递枚举,而不必重写代码来处理新类。

这甚至可能吗?您是否可以使用JSON字符串来帮助重新创建枚举,以便将其用作枚举?

编辑:奇怪,我有一个大红色横幅告诉我Stack Overflow需要外部Javascript,现在我无法评论帖子......

感谢Brian在下面的回复,但它本质上与我在这里链接的两个相同,它不会导致您实际拥有枚举对象,只是通过不同方法的常量。

1 个答案:

答案 0 :(得分:2)

Java中的enum是一个类,编译器会添加静态valueOf(String name)方法。所以如果你有:

enum MyEnum  { 
      ONE(1.0), TWO(2.0), THREE(3.0); 

      private double myDouble; 

      MyEnum(double d) {  
          myDouble = d;
      }

      public double getDouble() {
          return myDouble;
      }
}

你可以说:

MyEnum e = MyEnum.valueOf("ONE");
assert(e.equals(MyEnum.ONE));
System.out.println(e.getDouble());

更流行的Java JSON解析器处理枚举就好了。以下是Gson的一个例子:

public class App
{

    public static void main(String[] args) 
    {
        // Array containing your enum constants
        String json = "[\"ONE\",\"TWO\",\"THREE\"]";

        Type t = new TypeToken<Collection<MyEnum>>(){}.getType();
        Collection<MyEnum> c = new Gson().fromJson(json, t);

        for (MyEnum me : c)
        {
            System.out.println(me);
            switch(me)
            {
                case ONE:
                    System.out.println("This is equal to MyEnum.ONE");
                    break;
                case TWO:
                    System.out.println("This is equal to MyEnum.TWO");
                    break;
                case THREE:
                    System.out.println("This is equal to MyEnum.THREE");
                    break;
            }
            System.out.println(me.getDouble());

        }
    }    
}

输出:

  

一个这等于MyEnum.ONE
1.0
  TWO
这等于MyEnum.TWO
2.0   三,这等于MyEnum.THREE
3.0