С http://wiki.fasterxml.com/JacksonInFiveMinutes (но также посмотрите на TypeFactory в Джексоне 1.3+):
Связывание данных с обобщенными данными
Помимо привязки к POJO и «простым» типам, существует еще один вариант: привязка к универсальным (типизированным) контейнерам. В этом случае требуется специальная обработка из-за так называемого стирания типов (используется Java для реализации обобщений в некоторой степени обратно совместимым образом), что не позволяет использовать что-то вроде Collection.class (который не компилируется).
Так что, если вы хотите привязать данные к карте, вам нужно будет использовать:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
, где TypeReference требуется только для передачи определения универсального типа (в данном случае через любой внутренний класс): важной частью является>, которая определяет тип для привязки.
Если вы этого не сделаете (и просто передадите Map.class), вызов эквивалентен привязке к Map (то есть «нетипизированная» Map), как объяснено выше.
Если вы имеете в виду полиморфную десериализацию, отметьте эту ссылку http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html, в которой обсуждается использование аннотаций Джексона, чтобы помочь мапперу выбрать правильный объект для задания.
Я написал это сегодня (я уверен, что это можно улучшить), просто взяв строку JSON и всегда преобразуя ее в список DTO (или во что бы то ни было, в которое она может быть преобразована). Это может быть вызвано с любым типом, и может быть изменено, чтобы возвратить единственный экземпляр, или Список, или что угодно. OBJECT_MAPPER является статической переменной ObjectMapper.
public static <T> List<T> getFromJSONCollection(String jsonString, final Class<T> type) throws IOException {
try {
return OBJECT_MAPPER.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, type));
} catch (JsonMappingException e) {
return getFromJSON(jsonString, type);
}
}
public static <T> List<T> getFromJSON(final String jsonString, final Class<T> type) throws IOException {
return new ArrayList<T>() {{ add(OBJECT_MAPPER.readValue(jsonString, type));}};
}