Как определить тип объекта во время выполнения в Java для gson - PullRequest
1 голос
/ 26 февраля 2011

Взгляните на следующий код, который отлично работает:

        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 ]

1 голос
/ 26 февраля 2011

В 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 голос
/ 26 февраля 2011

Вы имеете в виду, что MyData станет универсальным типом T? Если это так, вы не сможете сделать это из-за стирания типа Javas. Тип T доступен только во время компиляции.

Вы можете создать метод, подобный:

public T decodeJSON(String json, Class<T> type) {
    GSON gson = new GSON();
    return gson.fromJson(json, type);
}
0 голосов
/ 26 февраля 2011
String toJson = gson.toJson(Class.forName(obj, runtimeClassName + "[]"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...