如何在Java中为gson确定运行时对象的类型

时间:2011-02-25 23:42:31

标签: java json reflection 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和String字段的简单类。这完全没问题。但是如果直到运行时才知道该类呢?例如它可能不是“MyData”,但可能是一个完全不同的类。我们唯一知道的是类的名称(表示为字符串),以前由发件人使用Class.forName确定。

如果对象不是数组,它可以正常工作,如下所示:

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

上述技术不适用于数组。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

在java中,您可以通过调用

来获取对象的类
object.getClass();

来自java docs:

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 :(得分:1)

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

您可以创建一个方法:

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

答案 2 :(得分:-1)

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