Если вы ожидаете получить список, вы должны передать тип списка: здесь вы указываете тип clazz
, но ожидаете тип List<T>
.Это не будет работать, даже если clazz
имеет тип List
.Таким образом, вы должны передать правильный тип.Но для типов List (и Map) вам также необходимо указать тип содержимого: переменная типа не подходит.Это работает примерно так:
List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });
, где TypeReference
необходимо использовать из-за стирания типа Java.
Вы также можете динамически создавать структурированные типы из компонентов, если они передаются в качестве аргументов:
Class<?> elem = ...;
List<?> list = mapper.readValue(jsonSource,
mapper.getTypeFactory().constructCollectionType(ArrayList.class, elem);
Причина, по которой вы получаете LinkedHashMap
, заключается просто в отсутствии информации о типе: если встречается JSON Object, и запрашиваемый тип равен java.lang.Object
(как в случае, если вы только что передали тип List.class
для привязки), это тип, который будет использоваться.