Java десериализация универсального типа с помощью Gson - PullRequest
4 голосов
/ 28 ноября 2011

Я пытаюсь десериализовать некоторый универсальный тип.Это хорошо работает, но я хотел бы поменять этот фрагмент кода на метод.

Type listType = new TypeToken<TestResult<MyObject>>(){}.getType();
TestResult<MyObject> result = new Gson().fromJson(json, listType);

Как это сделать, доказав информацию о типе?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2013

Да, вы можете. Есть обходной путь. Вы просто должны явно передать тип и класс «MyObject» в метод.

В вашем случае разработайте метод, имеющий следующую подпись и тело.

public <T> Object getGenericDataObjectFromJson(String json, Type t, Class<T> type) {

        // Convert Json String to Java object
         TestResult<T> obj = gson.fromJson(json, t);

        return obj;
    }

Где

  1. Строка json = ваша строка json
  2. Тип listType = ваш объект listType, переданный в качестве параметра
  3. Тип класса = MyObject.class

И вызов метода стал бы таким

GsonUtility gs = new GsonUtility();// Your gson utility class
JSONObject jsonObj = "your json string";

// Explicitly identifying the type so as to pass it to the method
// Because The type of a generics can't be determinted during runtime as #CKuk said

Type objectType = new TypeToken<DataObject<objectType>>(){}.getType();

TestResult<MyObject> resultObject= (TestResult<MyObject>) gs.getGenericDataObjectFromJson(jsonObj.toString(), objectType, MyObject.class);
0 голосов
/ 28 ноября 2011

Вы не можете.Тип универсального шаблона не может быть определен во время выполнения.

Простой обходной путь - добавить метод к MyObject для возврата результирующего Типа (как в первой строке примера кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...