Общий метод преобразования json в список‹T› не работает

public static <T> List<T> convertJSONStringTOListOfT(String jsonString, Class<T> t){
        if(jsonString == null){
            return null;
        }
        ObjectMapper mapper = new ObjectMapper();
        try
        {
            List<T> list = mapper.readValue(jsonString, new TypeReference<List<T>>() {});
            return list;
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

У меня есть вышеуказанный метод, когда я пытаюсь вызвать его, используя:

list = convertJSONStringTOListOfT(str, CustomAssessmentQuestionSetItem.class);

Возвращенный список List<LinkedHashMap> не List<CustomAssessmentQuestionSetItem>

Хотя, если я не использую дженерики, приведенный ниже код работает нормально:

list = mapper.readValue(str, new TypeReference<List<CustomAssessmentQuestionSetItem>>() {});

Оба вызова кажутся мне одинаковыми. Невозможно понять, почему общий создает List<LinkedHashMap> вместо List<CustomAssessmentQuestionSetItem>

К вашему сведению: я также пытался изменить сигнатуру метода на

public static <T> List<T> convertJSONStringTOListOfT(String jsonString, T t)

и соответствующий вызов

list = convertJSONStringTOListOfT(str,new CustomAssessmentQuestionSetItem());

но это не сработало.


person coding_idiot    schedule 24.03.2015    source источник
comment
На самом деле вы не используете свой параметр t.   -  person RealSkeptic    schedule 24.03.2015
comment
Как и он - stackoverflow.com/a/24997/566092, пытался использовать ошибки компиляции.   -  person coding_idiot    schedule 24.03.2015
comment
Верно, и комментарии говорят ему, что это неправильно.   -  person RealSkeptic    schedule 24.03.2015
comment
о, теперь я вижу, но до сих пор нет ссылки на то, что будет работать   -  person coding_idiot    schedule 24.03.2015


Ответы (1)


Поскольку у вас есть класс элемента, вы, вероятно, захотите использовать TypeFactory вашего картографа следующим образом:

final TypeFactory factory = mapper.getTypeFactory();
final JavaType listOfT = factory.constructCollectionType(List.class, t);

Затем используйте listOfT в качестве второго аргумента для .readValue().

person fge    schedule 24.03.2015