2011-02-25 52 views
1

看看下面的代码,它工作正常:如何确定物体的类型在运行时的Java为GSON

 MyData myData = new MyData(1, "one"); 
    MyData myData2 = new MyData(2, "two"); 
    MyData [] data = {myData, myData2}; 

    String toJson = gson.toJson(data, MyData[].class); 

    MyData [] newData = gson.fromJson(toJson, MyData[].class); 

MyData的仅仅是一个简单的类int和字符串字段。这工作非常好。但是如果这个类直到运行时才知道呢?例如它可能不是“MyData”,但可能是一个完全不同的类。我们唯一知道的是这个类的名字(用一个字符串表示),这是以前由发件人使用Class.forName确定的。

它工作正常,如果对象不是数组,像这样:

final Class<?> componentType = Class.forName(componentClassName); 
context.deserialize(someElement, componentType); 

上述技术不适用于阵列的工作,虽然。

有什么建议吗?

回答

-1
String toJson = gson.toJson(Class.forName(obj, runtimeClassName + "[]")); 
+0

你试试这个? – 2011-02-25 23:51:27

+0

这不会编译。没有这样的方法forName只需要两个参数。 – siiva33 2011-02-26 00:07:07

1

在Java中,你可以通过调用

object.getClass(); 

从Java文档获取类对象:

class Test { 
    public static void main(String[] args) { 
     int[] ia = new int[3]; 
     System.out.println(ia.getClass()); 
     System.out.println(ia.getClass().getSuperclass()); 
    } 
} 

它打印:

class [I 
class java.lang.Object 
1

你的意思MyData将成为泛型类型T?如果是这样,由于Java类型的擦除,你将无法做到这一点。类型T仅在编译时可用。

您可以创建等的方法:

public T decodeJSON(String json, Class<T> type) { 
    GSON gson = new GSON(); 
    return gson.fromJson(json, type); 
} 
+0

我在说它可能是MyData类型的类,或者它可能是SomeOtherData类型的类。我唯一需要处理的是一个字符串,它定义了正在发送的类的类型(从Class.forName中检索) – siiva33 2011-02-25 23:55:23

相关问题