Проблема в том, что результат.список posts после вызова содержит один массив объектов LinkedTreeMap (с правильными значениями, поэтому проблема в десериализации) вместо объектов MyJson. Когда я использую MyObject вместо T, все работает нормально, и MyObject работает правильно.
Итак, есть ли какой-либо способ реализовать вызов десериализации без создания пользовательского десериализатора?
Переведено автоматически
Ответ 1
Вы должны указать тип T во время десериализации. Как бы создавался ваш List оф posts, если бы Gson не знали, что Type создавать? Это не может оставаться T вечно. Итак, вы должны указать тип T в качестве Class параметра.
Теперь предположим, что тип posts был String, который вы бы десериализовали MyJson<String> как (я также добавил String json параметр для простоты; вы бы читали из своего reader, как и раньше):
Я предположил, MyJson<T> что мои примеры будут такими
publicclassMyJson<T> {
public List<T> posts;
public List<T> getPosts() { return posts; } }
Итак, если вы искали способ десериализации List<MyObject>, вы бы вызвали метод как
// assuming no Void parameters were required MyJson<MyObject> myJson = doInBackground(MyObject.class);
Ответ 2
Вы пробовали?
gson.create().fromJson(reader, MyJson.class);
Редактировать
После прочтения этого поста кажется, что вы используете Type правильно. Я полагаю, что ваша проблема заключается в использовании T. Вы должны помнить, что в Java существует удаление типов. Это означает, что во время выполнения все экземпляры T заменяются на Object. Следовательно, во время выполнения вы действительно передаете GSON MyJson<Object>. Если бы вы попробовали это с конкретным классом вместо <T>, я думаю, это сработало бы.